4

更新されたテーブルに複数の結合がある SQL Server のテーブルを更新する方法は? MySQL では、更新されたテーブルのエイリアスを定義できますが、TSQL ではどのように機能しますか。

 UPDATE recert.ou              --#1-- In MSSQL/TSQL no alias allowed
SET parent_id = o2.ID
    FROM recert.ou as O              
    JOIN recert.country C ON C.ID = O.country_id
    JOIN recert.ou P ON O.parent_id = P.ID and p.country_id <> O.country_id     
    JOIN recert.ou o2 on o2.name = p.name and c.ID = o2.country_id              
    JOIN recert.country as c2 on c2.ID = o2.country_id
           WHERE O.ID = o2.ID

-

RESULT: *The table 'o' is ambiguous.*
4

4 に答える 4

8

これは Sql Fiddle で動作します。

UPDATE o
SET parent_id = o2.ID
    FROM recert O
    JOIN c C ON C.ID = O.country_id
    JOIN recert P ON O.parent_id = P.ID and p.country_id <> O.country_id
    JOIN recert o2 on o2.name = p.name and c.ID = o2.country_id
    JOIN c c2 on c2.ID = o2.country_id
WHERE O.ID = o2.ID

エイリアスを再エイリアスしようとしたために問題が発生したと思いますが、よくわかりません。

于 2012-05-29T15:02:12.020 に答える
1

すべてを WHERE 句に移動できます。

UPDATE o              --#1-- In MSSQL/TSQL no alias allowed
    SET parent_id = o2.ID
    FROM c, o, o o2, C c2
    Where o.country_id = c.id and o.parent_id = p.id and p.country_id <> O.country_id and
          o2.name = p.name and c.ID = o2.country_id and c2.ID = o2.country_id

これは私のお気に入りの結合スタイルではありませんが、目的には十分なはずです。

ただし、TSQL では、実際には次のようにします。各 ID の新しい更新値を返すクエリを作成します。次に、次の形式でクエリを記述します。

with toupdate as (<the query>)
    update o
        set o.parent_id = toupdate.id
    from toupdate
    where o.id = toupdate.id       
于 2012-05-29T14:30:30.563 に答える
-2

自己結合更新

update #table1 set column1= b.column2
from #table1 #table1, #table1 b where #table1.Id=b.Id  
于 2018-08-28T03:58:27.657 に答える