2013-01-04 29 views
1

我正在與別人的代碼苦苦掙扎。 WHERE子句在以下(MySQL)語句中可以做什麼?SQL「IN」與WHERE子句中的「=」相結合

SELECT * FROM t1, t2 WHERE t1.id = t2.id IN (1,2,3) 

它沒有提供我想要的結果,但我試圖找出原作者的意圖。 任何人都可以提供使用這樣的WHERE子句的例子嗎?

+1

你使用什麼數據庫,如果我沒看錯這個語法在SQL Server 2000中得到了支持,但不得遲 – Habib

+0

我會說這是如果一個bug該語法實際上是允許的 –

回答

4

這種情況從右側開始,評估t2.id IN (1,2,3),得到結果(0或1),並將它用於與t1.id聯接。來自IN列表的所有行t2id都連接到t1的行中,該行具有一個id; t2的所有其他行與t1中具有零的id的行連接。這是sqlfiddle.com的小演示:link

但很難想象這是作者的意圖,但是:我認爲更有可能的檢查是兩個項目都在列表中,並且也相互平等。彼此之間的平等很重要,因爲它看起來像作者想要加入這兩個表格。

更加現代的連接方式是使用ANSI SQL語法。這是您的查詢的ANSI SQL等價的:

SELECT * FROM t1 JOIN t2 ON t1.id = t2.id IN (1,2,3) 
+0

有趣的是,在記者頁面http://dev.mysql.com/doc/refman/5.5/en/operator-precedence.html甚至沒有關於關聯性的單詞(來自我的+1 ) – zerkms

+0

我認爲這是另一種方式... IN首先被評估,然後它的結果被用於連接。見http://sqlfiddle.com/#!2/6f2f5/1 – AndreKR

+0

@AndreKR我認爲你是對的 - 它看起來像'IN'具有比'='更高的優先級。我不知道爲什麼我認爲它是從左到右。我重寫了這個問題的答案。非常感謝你! – dasblinkenlight