2012-01-11 25 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) 

を削除し、次のクエリをしようとしたクエリが不正な形式であるとき、これが発生している理由を誰かが私に説明できますか?なぜそれは真実と評価されるようですか?

注:これはTableAIDTableAに存在しないため、クエリがTableBから列を使用しているSQL Server 2008 R2の

+1

良い質問を、私も前にこの全体を実行しています。 – RedFilter

+0

注意: 'TableB'は実際に' somebadcolumn'という列を持っていると仮定していますか?もしそうなら、あなたはその質問にそれを見逃しました。 –

+0

列が存在しません。私は質問を更新してより明確にしています。 – tsells

答えて

4

で試験しました。

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

だから、本質的には、それはやっている:

delete from TableB 
where id in (TableAID) 

を参照するとき、あなたのテーブル名を言及するために最善をサブクエリを使用している場合はそのためのクエリは同じです。次例外がスローされます:

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

関連する問題