2012-01-23 149 views
2

可能重複:
sql server 2008 management studio not checking the syntax of my query
T-SQL Deletes all rows from a table when subquery is malformedSQL陳述

請參閱下面的查詢:

select * from tablea where reference in (
select reference from tableb) 

reference不TableB中存在,所以我希望看到一個錯誤,如何反而會返回表a中的所有行。


爲什麼tablea中的所有行都返回?

+5

Sql Server,Oracle,Sybase ASE,MySQL? –

+0

sql服務器。謝謝。 – w0051977

+0

不應該有'NOT IN'返回的行。 [你確定你沒有使用'IN'?](http://stackoverflow.com/q/4594733/73226) –

回答

5

裏面的子查詢select reference from tableb你可以看到來自上層查詢的所有列,所以你的條件實際上就像「where 1 = 1」一樣工作。

這是一個好建議的原因之一,「如果您從多個表中選擇,則爲每個表提供一個別名」。例如,在你的情況下:

select a.* from tablea a where a.reference in (
select b.reference from tableb b) 

這樣你會得到預期的編譯錯誤。

+0

是的,將查詢更改爲'select * from tablea where reference in(select tableb.reference from tableb)' –

+0

第二個查詢說:從tableb中選擇引用。但是,tableb中不存在引用。當然應該有一個錯誤?我明顯錯過了一些東西。謝謝。 – w0051977

+0

Olivier,您的評論按照您的描述進行。但是,爲什麼這不會產生語法錯誤,如「從tableb選擇tableb.reference」(本身就是這樣)。只要添加外部查詢,內部查詢就可以工作。 – w0051977