2012-01-11 36 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