2011-09-26 21 views
2

更新表我有以下問題:與條件

我有表:

TEST_TABLE 
x_Id|y_Id 
--------- 
    2| 7 
    2| 8 
    3| 7 
    4| 7 
    5| 8 

我想刪除記錄,如果有X_ID y_Id(7)和y_Id(8)。如果y_Id = 8且y_Id(7)不存在於唯一的x_Id中,則將y_Id更新爲7。

x_Id和y_Id是複合鍵。結果的

實施例:

TEST_TABLE 
x_Id|y_Id 
--------- 
    2| 7 
    3| 7 
    4| 7 
    5| 7 
+0

你能寫一個選擇,其中x_Id有y_Id(7)和y_Id(8),只是有刪除問題嗎?如果是這樣,請發佈您迄今爲止的內容。 – RedFilter

回答

1

這些查詢不使用corelated子查詢(它們必須爲外部查詢的每一行執行),因此它們應該非常高效。

delete from test_table 
where y_id = 8 
and x_id in (select x_id from test_table where y_Id = 7); 

update test_table set y_id = 7 
where x_id in (select x_id from test_table where y_id = 8) 
and x_id not in (select x_id from test_table where y_id = 7); 
+0

你有沒有看過SQL Server中的執行計劃?檢查你的UPDATE語句,然後檢查我的選擇'UPDATE TEST_TABLE SET'y_Id = 7 FROM TEST_TABLE x WHERE y_Id = 8 AND NOT EXISTS(SELECT * FROM TEST_TABLE WHERE y_Id = 7 AND x_Id = x.x_Id)' – rabudde

+0

'IN'子句導致可以通過使用'EXISTS'子句阻止的嵌套循環 – rabudde

+0

要添加一件事:第二個'WHERE'條件是不必要的,因爲您刪除滿足此條件的行 – rabudde

5

刪除重複(其中對於X_ID都存在y_Id的7和8),並更新所有剩餘y_Id其中y_Id = 8

DELETE FROM TEST_TABLE t1 WHERE y_Id=8 AND EXISTS (SELECT * FROM TEST_TABLE WHERE x_Id=t1.x_Id AND y_Id=7) 
UPDATE TEST_TABLE SET y_Id=7 WHERE y_Id=8