簡體   English   中英

內部聯接和常規表的外部左聯接

[英]Outer left join of inner join and regular table

在我的職業生涯中,我第一次發現需要將聯接結果與表連接起來,其中第一個聯接是內部聯接,第二個聯接是左外部聯接。

我來到這個解決方案:

SELECT * FROM
(
    TableA INNER JOIN TableB ON
    TableA.foreign = TableB.id
)
LEFT OUTER JOIN TableC
ON TableC.id = TableB.id

我知道我可以為第一個聯接創建一個視圖,但是我不想在數據庫中創建新對象。

這個代碼正確嗎? 我得到了一致的結果,但我想驗證一下理論上是否正確。 您對改進這種方法有什么建議嗎?

您應該以更簡單的方式進行操作。

SELECT * FROM
TableA
INNER JOIN TableB ON TableA.foreign = TableB.id
LEFT OUTER JOIN TableC ON TableB.id = TableC.id

通常是通過這種方式完成的。

我相信您正在尋找這樣的東西:

SELECT *, t.otherFields
FROM
(
    SELECT TableB.id, otherFields FROM TableA
    INNER JOIN TableB ON
    TableA.foreign = TableB.id
) t
LEFT OUTER JOIN TableC
ON TableC.id = t.id
SELECT * 
FROM TableA 
    INNER JOIN TableB ON
        TableA.foreign = TableB.id
LEFT OUTER JOIN TableC
    ON TableC.id = TableB.id

還可以

是的,它是正確的,但它與沒有括號的相同(簡單)查詢沒有什么不同:

SELECT  * 
FROM    TableA 
        INNER JOIN TableB 
            ON TableA.foreign = TableB.id
        LEFT OUTER JOIN TableC
            ON TableC.id = TableB.id;

SQL Fiddle顯示兩個具有相同結果的查詢

另外值得注意的是,兩個查詢的執行計划完全相同

當您需要對內部聯接的結果進行左聯接時,會使用括號,例如,如果您只想返回表c中有記錄的表b的結果,但仍然對表A保持聯接,則可以這樣寫:

SELECT  * 
FROM    TableA 
        LEFT OUTER JOIN TableB 
            ON TableA.foreign = TableB.id
        INNER JOIN TableC
            ON TableC.id = TableB.id;

但是,由於下面的INNER JOIN,這實際上將TableB上的LEFT OUTER JOIN變成了INNER JOIN。 在這種情況下,您可以根據需要使用括號來更改JOIN:

SELECT  * 
FROM    TableA 
        LEFT OUTER JOIN (TableB 
        INNER JOIN TableC
            ON TableC.id = TableB.id)
            ON TableA.foreign = TableB.id;

SQL小提琴在添加括號時顯示結果差異

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM