2016-05-17 54 views
0

下面的示例表。我最近添加了「is_last_child」這一列,如果行是最後一個孩子(或者不是父母),我們希望將它更新爲1。我有一個查詢使用select子查詢更新列到同一個表

update node set is_last_child=1 where id not in (select parent_id from node); 

我運行它時出現以下錯誤。 「您無法在FROM子句中指定目標表'節點'進行更新」。我試過使用連接,但我確定我只能更新不是父級的行。任何人有任何想法或遇到類似的情況?

id | parent_id | is_last_child 
1 | 1  |  0 
2 | 1  |  0 
3 | 1  |  0 
4 | 2  |  0 
5 | 4  |  0 
6 | 1  |  0 

基本上我想選擇IDS 3,5,6,設置列is_last_child等於1。這不是我的模式,並有數千行的,但上面的表格只是把事情簡單化。

回答

0

你想UPDATE FROM

UPDATE N1 
SET N1.is_last_child = 1 
FROM Node N1 
LEFT OUTER JOIN Node N2 
    ON N1.ID = N2.Parent_ID 
WHERE N2.ID IS NULL 

左外連接在概念上與使用NOT IN只是它更易於閱讀和你不需要一堆嵌套查詢。

+0

謝謝!這工作。我只是不得不改變語法,因爲我使用mysql,但我得到它在他結束工作。 –

0

使用另一個子查詢,因爲您無法更新同時選擇的表(在MySQL中)。但是,通過建立一個臨時表,它的工作原理

update node 
set is_last_child=1 
where id not in 
(
    select * from 
    (
    select parent_id from node 
) tmp 
); 
+0

感謝您的幫助。你的解決方案工作,但我讀了,它不被推薦,如果它可以避免 –

0

雖然你不能更新你從選擇表,我覺得你可以更新表與其自身連接:

UPDATE `node` AS n1 LEFT JOIN `node` AS n2 ON n1.id = n2.parent_id 
SET n1.is_last_child = 1 
WHERE n2.id IS NULL 
; 
相關問題