Sql server 这是一个SQL解析器错误吗?还是我的误解?

Sql server 这是一个SQL解析器错误吗?还是我的误解?,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,使用SQL Server 2008 R2版本10.50.4000.0: 我有两张桌子。我想删除一个表中的数据,而另一个表中存在ID。很简单。然而,由于键入错误,我发现了一个解析器错误 在下面的脚本中,[SomeID]是表1中的一列,但实际上不存在于表2中 Delete from Table1 where [SomeID] in (Select [SomeID] from Table2) 如果从表2中运行子查询Select[SomeID],则会收到一条相应的错误消息,指出该列不存在 但是,如果您

使用SQL Server 2008 R2版本10.50.4000.0:

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

在下面的脚本中,[SomeID]是表1中的一列,但实际上不存在于表2中

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2)
如果从表2中运行子查询Select[SomeID],则会收到一条相应的错误消息,指出该列不存在

但是,如果您运行整个delete查询,它将毫无错误地运行,并删除表1中的所有内容

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

谢谢, 托尼

这不是一个错误 引擎将执行您在查询中输入的操作

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

例如,您可以这样做

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2 where IdTable2 = SomeId)
因此,您可以返回select中的任何内容,如常量、表2中的Id、两者的总和,或者像本例一样,返回第一个表中的Id

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

这不是一个错误 引擎将执行您在查询中输入的操作

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

例如,您可以这样做

Delete from Table1 where [SomeID] in (Select [SomeID] from Table2 where IdTable2 = SomeId)
因此,您可以返回select中的任何内容,如常量、表2中的Id、两者的总和,或者像本例一样,返回第一个表中的Id

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

我可以确认您所发现的。解析器不够聪明,无法弄清楚您希望在这种情况下发生什么。它猜测您想在外部查询中使用表中的字段。顺便说一句,要学习的经验是,您应该始终使用表名或表别名限定字段名。我可以确认您所发现的内容。解析器不够聪明,无法弄清楚您希望在这种情况下发生什么。它猜测您想在外部查询中使用表中的字段。顺便说一句,要吸取的教训是,您应该始终使用表名或表别名限定字段名。这绝对是一个教训。仅供参考,在清理测试数据库上的测试导入时,我确实希望删除表中第二个表中有相应记录的所有内容。只是删除了超出我预期的内容,并希望更好地理解为什么没有出现错误。当我把问题打出来的时候,我算出来了,但需要确认。谢谢,这绝对是一个教训。仅供参考,在清理测试数据库上的测试导入时,我确实希望删除表中第二个表中有相应记录的所有内容。只是删除了超出我预期的内容,并希望更好地理解为什么没有出现错误。当我把问题打出来的时候,我算出来了,但需要确认。谢谢