我讀的紅移SQL查詢和無法理解的最後一部分:JOIN(SELECT ...)ue ON 1 = 1?
...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1
是什麼意思ON 1=1
這裏?
我讀的紅移SQL查詢和無法理解的最後一部分:JOIN(SELECT ...)ue ON 1 = 1?
...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1
是什麼意思ON 1=1
這裏?
這只是做一個交叉連接,它選擇第一個表中的所有行和第二個表中的所有行,並顯示爲笛卡爾積,即具有所有可能性。 (1,1 = 1總是正確的,不會消除任何東西),則1 = 1就是說「1 = 1總是正確的,不會消除任何東西」 。
你可以重寫查詢爲
... CROSS JOIN (SELECT MIN(modified) AS first_modified FROM user)
,並得到相同的結果
我相信它用來模擬笛卡爾連接。
從您的查詢,最少的修改後的值(這將只是1元)將被分配給左表的所有記錄。
PS:左連接在這裏沒多大用處。不妨使用inner join
的目的是無條件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
@NahuelFouilleul:好點,'SELECT'列表中的子查詢表達式也適用。由於子查詢是*不相關*,我寧願加入一個實例。而且我們還不能確定這個值是否真的在'SELECT'列表中結束,可能僅用於'WHERE','ORDER BY'等等。)查詢計劃在大多數情況下應該是相同的。 –
它只是保證了'join'將返回匹配 - '1 = 1'是一樣的作爲'真實'。給定子查詢,它只會返回一行 - 'min(modified)'。該值將被合併到其他連接。幾乎就像一個「交叉連接」,但只有一個值。 – sgeddes