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