2016-02-13 60 views
7

我讀的紅移SQL查詢和無法理解的最後一部分:JOIN(SELECT ...)ue ON 1 = 1?

... 
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue 
ON 1=1 

是什麼意思ON 1=1這裏?

+2

它只是保證了'join'將返回匹配 - '1 = 1'是一樣的作爲'真實'。給定子查詢,它只會返回一行 - 'min(modified)'。該值將被合併到其他連接。幾乎就像一個「交叉連接」,但只有一個值。 – sgeddes

回答

3

這只是做一個交叉連接,它選擇第一個表中的所有行和第二個表中的所有行,並顯示爲笛卡爾積,即具有所有可能性。 (1,1 = 1總是正確的,不會消除任何東西),則1 = 1就是說「1 = 1總是正確的,不會消除任何東西」 。

你可以重寫查詢爲

... CROSS JOIN (SELECT MIN(modified) AS first_modified FROM user) 

,並得到相同的結果

+3

它不完全是'交叉連接',因爲當右表沒有返回行時,'交叉連接'將返回沒有行,但是'1 = 1上的左連接'將返回左表中所有具有空值的行作爲右表。所以要小心重寫。 – dey

+1

這個答案是錯誤的。檢查Erwin的答案。 – sotn

3

我相信它用來模擬笛卡爾連接。

從您的查詢,最少的修改後的值(這將只是1元)將被分配給左表的所有記錄。

PS:左連接在這裏沒多大用處。不妨使用inner join

11

的目的是無條件LEFT JOIN,這是不同從一個CROSS JOIN在左表表達式的所有行返回,即使在右表表達式中沒有匹配 - 而CROSS JOIN從結果中刪除這樣的行。 More on joins in the manual.

然而:

1=1是在Postgres的無意義all derivatives包括亞馬遜紅移。只需使用true即可。這可能是從另一個不支持boolean類型的RDBMS繼續進行的。

... LEFT JOIN (SELECT ...) ue ON true 

話又說回來,LEFT JOIN是毫無意義的與SELECT MIN(modified) FROM user右邊這個特定的子查詢,因爲聚合函數(min()),並沒有GROUP BY子句的SELECT總是返回一行。這種情況下(而不是其他情況下,沒有行可能被發現)可以簡化爲:

... CROSS JOIN (SELECT MIN(modified) AS first_modified FROM user) ue 
+0

@NahuelFouilleul:好點,'SELECT'列表中的子查詢表達式也適用。由於子查詢是*不相關*,我寧願加入一個實例。而且我們還不能確定這個值是否真的在'SELECT'列表中結束,可能僅用於'WHERE','ORDER BY'等等。)查詢計劃在大多數情況下應該是相同的。 –