2012-05-29 24 views
2

如何在更新的表上使用多個聯接更新SQL Server上的表? 在MySQL中,您可以爲更新的表定義別名,但它如何與TSQL協同工作。如何在更新的表上使用多個聯接更新SQL Server上的表? (FROM FROM JOIN)

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.* 
+1

你爲什麼會把'o'變成'o'? –

+2

如果你有'UPDATE O1 SET parent_id = O2.ID FROM o AS O1等等等等等等,會發生什麼......'? TSQL *不允許別名出現在「UPDATE」語句中。但是我從來沒有嘗試過用別名替換它自己的名字。 – MatBailie

+0

@NikolaMarkovinović:原文:'FROM recert.o AS o' – hoerf

回答

7

This works on 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 

我想這個問題的出現是因爲您試圖重新別名別名,但我不確定。

+0

'recert'是瑪和表'ou'。 - >'recert.ou as o'。我編輯問題。 – hoerf

+0

@hoerf - 將此視爲概念證明。只需在上面的查詢中向每個recert添加.ou即可。 –

+0

@hoerf作爲查詢現在站立,在我quetstion –

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  
+0

相同的錯誤'UPDATE SET recert.ou = PARENT_ID O2。[ID] FROM recert.ou AS O,recert.country,recert.ou AS P,recert.ou如O2,recert.country C2,recert.country C其中ö .ID = o2.ID AND C.ID = O.country_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' – hoerf

1

你只需要爲O表

UPDATE o    
SET parent_id = o2.ID 
FROM o    
JOIN c C ON C.ID = o.country_id 
JOIN o P ON o.parent_id = P.ID and p.country_id <> o.country_id 
JOIN o 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 
+0

原文:'FROM recert.o AS O'我用'在O'作爲別名'加入... o.country_id' – hoerf

相關問題