这是一个SQL Parser错误吗?还是我的误会?

时间:2012-09-06 16:38:42

标签: sql-server sql-server-2008-r2

使用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中指定任何列,因此在我看来,解析器应该足够聪明,知道出现了错误。幸运的是,当发生这种情况时,我们处于测试环境中。 :)

谢谢, 贝

1 个答案:

答案 0 :(得分:0)

这不是错误 引擎将执行您在查询中所做的操作。

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

例如,你可以这样做

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

因此,您可以将select中的任何内容作为常量返回,作为table2中的Id,两者之和,或者,就像这种情况一样,返回第一个表中的ID。

在这种情况下,当执行子查询时,由于没有where子句,子查询将始终返回结果(除非没有行),因为它没有过滤器,但是将会呈现 ?您在父查询中指定了一个字段,并且您能够显示该字段,因此它将返回该字段。 对于corse,当你和In比较时,所有在table1中删除所有,对吧?