2013-04-29 217 views
1

爲什麼刪除語句的侷限性超出了他們的選擇對象?複雜刪除SQL語句

我沒有被卡住,因爲問題很容易解決,但我寧願修復我的理解,而不是繼續使用解決方法。

舉個例子,我有一個帶有字段V1和V2的無向邊緣列表。不幸的是,當創建表時,我引入了重複項(即V1→V2和V2→V1)。爲了識別複本,我跑查詢:

SELECT t1.V1, t1.V2 
FROM table t1 
WHERE t1.V1 > t1.V2 
    and EXISTS (
     SELECT * 
     FROM table t2 
     WHERE t2.V1 = t1.V2 
      and t2.V2 = t1.V1) 

,因爲這回一組漂亮的從表中的行,我想我應該能夠替換刪除選擇線並重新運行相同的查詢。但是,Sql服務器變得瘋狂,而是給我寫了紅色字母。關於語法和調整之後,有關綁定多部分標識符的信息。

我設法將select存儲在一個表變量中,並完成刪除 - 這沒問題,但是我的原始方法出了什麼問題,我可以用單個SQL語句來完成嗎?

+0

如果你到底什麼報道的「紅字」說,這可能會有幫助。而且,也正是你的DELETE語句的樣子(它是「DELETE t1」後跟FROM ...?)。 – GilM 2013-04-29 18:06:43

+0

您的表格實際上稱爲「表格」?你會給你的孩子命名爲「孩子」嗎? – wildplasser 2013-04-29 18:20:14

回答

4

SQL Server與delete相當靈活。雙from的語法允許幾乎任何地方select是:

DELETE FROM t1 
FROM table t1 
WHERE t1.V1 > t1.V2 
    and EXISTS (
     SELECT * 
     FROM table t2 
     WHERE t2.V1 = t1.V2 
      and t2.V2 = t1.V1) 
+0

太酷了!不知道從雙倍。不得不看那個。謝謝! – bob 2013-04-29 18:06:53

0

我認爲你需要類似這樣的語法;

delete from yourTable 
where v1 in 
(select v1 
from etc 
) 
+0

也許,但這兩個條件來識別重複的邊緣,所以子查詢中的where子句必須考慮etc.1 = yourTable.2和etc.2 = yourTable.1。 – bob 2013-04-29 18:03:17