复杂删除SQL语句

时间:2013-04-29 17:47:29

标签: sql tsql

为什么删除语句有超出其选择对应项的限制?

我没有被卡住,因为问题很容易解决,但我宁愿修复我的理解而不是继续使用变通办法。

例如,我有一个无向的边缘列表,其中包含字段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 )

因为这从表中返回了一组很好的行,我想我应该能够用delete替换select行并重新运行相同的查询。然而,Sql server生气了,而是给了我红色字母。关于语法和调整之后,关于绑定多部分标识符的事情。

我设法将select存储在一个表变量中并完成删除 - 这没关系,但是我的原始方法有什么问题,我可以用一个SQL语句完成它吗?

2 个答案:

答案 0 :(得分: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 )

答案 1 :(得分:1)

我认为你需要类似这样的语法;

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