[英]LEFT JOIN WHERE Clause IS NOT NULL
我有兩個表A和B Common列x
SELECT A.*
FROM A
LEFT JOIN B
ON A.x == B.x
WHERE A.z == "Hola" AND B.y IS NOT NULL;
我對與EXIST或LEFT JOIN WHERE子句相比為null會產生什么輸出感到困惑。
如果我沒記錯的話,這需要A上的內容以及A&B之間的相同之處,但排除B無效的地方,對嗎?
如果表包含以下值:
**Table1** **Table2**
ID Values ID Values
1 100 1 10
2 200 2 20
3 300 3 30
4 400 4 40
null 2000 null 3000
5 500
您的查詢將返回以下內容:
其中: A.Id, A.table1_values, B.Table2_values
ID Table1_Values Table2_Values
1 100 10
2 200 20
3 300 30
4 400 40
5 500 null
a.*
最終輸出:
ID Table1_Values
1 100
2 200
3 300
4 400
5 500
null 2000
從此處復制的數據: 左外部聯接,具有空值
這是您的查詢:
SELECT A.*
FROM A LEFT JOIN
B
ON A.x = B.x
WHERE A.z = 'Hola' AND B.y IS NOT NULL;
您需要分解查詢。
結果集將只有AZ = 'Hola'
。 這是WHERE
子句中的重要過濾器。
然后, By IS NOT NULL
意味着兩件事:匹配項存在於B
,並且y
不為NULL
。 因此,此查詢等效於:
SELECT A.*
FROM A INNER JOIN
B
ON A.x = B.x
WHERE A.z = 'Hola' AND B.y IS NOT NULL;
通過內部聯接,可以將WHERE
條件置於ON
。 那是風格問題。 您不能通過LEFT JOIN
做到這一點。
然后,“等效” EXISTS
查詢將是:
SELECT A.*
FROM A
WHERE A.z = 'Hola' AND
EXISTS (SELECT 1 FROM B WHERE A.x = B.x AND B.y IS NOT NULL);
這些並不完全相同。 如果B
存在多個匹配項,則具有JOIN
的版本將返回A
重復行。 因為只從A
進行選擇,所以可能不希望重復,因此建議使用EXISTS
查詢。
非常簡單,但很好的問題。
讓我們進行轉換並找到答案
WHERE
謂詞By
對JOIN
-clause SELECT
A.*
FROM
A
LEFT JOIN B ON A.x == B.x
AND B.y IS NOT NULL
WHERE
A.z == "Hola";
現在我們可以:
LEFT JOIN
轉換為UNION ALL
JOIN-
和NOT EXISTS-
表達式 LEFT JOIN
-> JOIN
+ NOT EXISTS
SELECT A.*
FROM A
JOIN B ON A.x == B.x
AND B.y IS NOT NULL
WHERE
A.z == "Hola"
UNION ALL
SELECT A.*
FROM A
WHERE
A.z == "Hola"
AND NOT EXISTS(
SELECT * FROM B
WHERE A.x = B.x
AND B.y IS NOT NULL
)
查看這些表達式,我們可以看到:
NOT NULL
定義UNION ALL
下部變得多余 您可以嘗試如下操作:
select a.*
from a
where a.z = "Hola"
and exists (select 1
from b
where b.y is not null
and b.x = a.x);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.