2016-12-08 11 views
0

colunm parentIdを含むテーブルがあります(このIDは存在しないという制約はありませんが、不良データの原因です!!!)。 私は2つの別々のことをしたい ビット列を追加する - ParentIdがあり、これが実際にテーブルに存在する場合にのみtrueを含む ビット列を追加するIsParent - 参照を持つ場合のみtrueを含む子供テーブル全体の行に応じて列を更新する方法

私は次のように何かを思い付く:

UPDATE MyTable 
    Set IsParent = 1 
    WHERE Id in (select distinct parentId from MyTable) and IsParent = 0 
UPDATE MyTable 
    Set IsChild = 1 
    WHERE parentId in (select id from MyTable) and IsChild = 0 

しかし、それは非常に遅いです!私たちが行うことができますどのように任意のアイデアそれより速く

ボーナス質問:MyTableとは、一時的なテーブル 我々は声明

+0

インデックスをparentIdに追加しますか? – TZHX

答えて

1

あなたが参加するアップデートを試すことができますできるだけ多くのエントリを作成しないように一度にすべてのフィールドを更新することができる場合です。 IdparentIdの両方にインデックスがある場合、これは理想的です。

UPDATE t1 
SET IsParent = 1 
FROM MyTable t1 
INNER JOIN MyTable t2 
    ON t1.Id = t2.parentId 
WHERE isParent = 0 

UPDATE t1 
SET IsChild = 1 
FROM MyTable t1 
INNER JOIN MyTable t2 
    ON t1.parentId = t2.Id 
WHERE isChild = 0 
+0

しかし、1回のパスでそれを行う方法はありますか? – Dave

+0

1つのトランザクション内で2つの更新をいつでも実行できます。 –

関連する問題