1

为什么 delete 语句的限制超出了它们的选择对应项?

我没有被卡住,因为这个问题很容易解决,但我宁愿修复我的理解,也不愿继续使用解决方法。

例如,我有一个带有字段 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 替换选择行并重新运行相同的查询。然而,Sql server 生气了,而是给了我红色的字母。一次是关于语法,然后是一些关于绑定多部分标识符的内容。

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

4

2 回答 2

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 )
于 2013-04-29T18:01:49.617 回答
1

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

delete from yourTable
where v1 in 
(select v1
 from etc
) 
于 2013-04-29T17:55:51.017 回答