2013-04-29 138 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