可能重复:
sql server 2008 management studio not checking the syntax of my query
我今天遇到了一个问题,其中子查询不好,结果是父表中的所有行都被删除了。
TableA
ID,
Text,
GUID
TableB
ID,
TableAID,
Text
delete from TableB
where id in (
select TableAID
from TableA
where GUID = 'fdjkhflafdhf'
)
如果您自己运行子查询,则会收到错误,因为表A中不存在列(TableAID)。如果运行完整查询 - 它会删除表B中的所有记录而不会出现错误。
我还尝试了以下查询删除了0条记录(预期)
delete from TableB where id in (null)
delete from TableB where id in (select null)
有人可以解释为什么在查询格式错误时会发生这种情况吗?为什么它似乎评估为真?
注意:这是在SQL Server 2008 R2上测试的
答案 0 :(得分:4)
由于TableAID
中不存在TableA
,查询正在使用TableB
中的列。因此查询与以下内容相同:
delete from TableB
where id in (
select TableB.TableAID
from TableA
where GUID = 'fdjkhflafdhf'
)
所以从本质上说它正在做:
delete from TableB
where id in (TableAID)
如果您使用子查询,最好在引用时提及您的表名。以下 WILL 会抛出异常:
delete from TableB
where id in (
select TableA.TableAID
from TableA
where TableA.GUID = 'fdjkhflafdhf'
)
此外,我会使用别名,以便我们知道我们所指的是哪个查询:
delete from TableB
where id in (
select a.TableAID
from TableA a
where a.GUID = 'fdjkhflafdhf'
)