[英]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;
另外值得注意的是,兩個查詢的執行計划完全相同
當您需要對內部聯接的結果進行左聯接時,會使用括號,例如,如果您只想返回表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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.