2012-01-11 35 views
3

可能重复:
sql server 2008 management studio not checking the syntax of my queryT-SQL删除表中的所有行,当查询是畸形

我碰到一个问题,今天跑到哪里子查询是坏的,结果是所有父表中的行被删除。

TableA 
ID, 
Text, 
GUID 

TableB 
ID, 
TableAID, 
Text 

delete from TableB 
where id in (
    select TableAID 
    from TableA 
    where GUID = 'fdjkhflafdhf' 
) 

如果你本身运行子查询你,因为如果你运行完整查询列(TableAID)不表A.存在得到一个错误 - 它将删除表B中的所有记录没有错误。

我也试过可以除去0记录(预期)

delete from TableB where id in (null) 
delete from TableB where id in (select null) 

有人能解释我为什么当查询是畸形的,这是发生下列查询?为什么它似乎评估为真?

注:这是SQL服务器上测试2008 R2

+1

好问题,我已经过这个以前一样运行良好。 – RedFilter 2012-01-11 14:54:10

+0

注:我假设'TableB'确实有一个名为'somebadcolumn'的列?如果是这样,你就错过了这个问题。 – 2012-01-11 14:59:22

+0

该列不存在。我更新的问题有更多的清晰。 – tsells 2012-01-11 15:01:30

回答

4

由于TableAIDTableA存在,查询使用列从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' 
    ) 
+0

这是有道理的。感谢您的解释。 – tsells 2012-01-11 15:12:48