2

使用 SQL Server 2008 R2(版本 10.50.4000.0):

我有两张桌子。我想删除另一个表中存在 ID 的表中的数据。很简单。但是,由于键入错误,我发现似乎是解析器错误。

在下面的脚本中,[SomeID] 是 Table1 中的一列,但实际上在 Table2 中并不存在

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2)

如果您运行子查询"Select [SomeID] from Table2,您会收到一条相应的错误消息,指出该列不存在。

如果你运行整个删除查询,它运行没有错误,并删除 table1 中的所有内容

似乎解析器应该发现表 2 中不存在该列。我知道您可以使用子查询外部的列,并且我意识到解析器假设我打算使用 table1 中的列,但是因为我没有指定 table2 中的任何列,所以在我看来,解析器应该足够聪明,知道有什么问题。幸运的是,发生这种情况时,我们处于测试环境中。:)

谢谢,托尼

4

1 回答 1

0

这不是错误引擎将执行您在查询中输入的内容。

当您使用In子句时,它将比较每一行,字段 SomeId,与结果In

例如,你可以这样做

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2 where IdTable2 = SomeId)

因此,您可以返回选择中的任何内容,作为常量,作为 table2 中的 Id,两者的总和,或者像这种情况下,返回第一个表中的 ID。

在这种情况下,当执行子查询时,由于没有 where 子句,子查询将始终返回结果(除非没有行),因为它没有过滤器,但是会显示什么?您正在父查询中指定一个字段,并且您可以显示它,因此它将返回它。当然,当您与 In 进行比较时,删除 table1 中的所有内容也是如此,对吗?

于 2012-09-06T17:22:32.583 回答