簡體   English   中英

左聯接位置子句不為空

[英]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查詢。

非常簡單,但很好的問題。

讓我們進行轉換並找到答案

步驟1:將WHERE謂詞ByJOIN -clause

SELECT 
    A.*
FROM 
    A
    LEFT JOIN B ON A.x == B.x
        AND B.y IS NOT NULL
WHERE 
    A.z == "Hola";

現在我們可以:

  1. LEFT JOIN轉換為UNION ALL JOIN-NOT EXISTS-表達式

第2步:轉換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
    )

查看這些表達式,我們可以看到:

  1. 在一般情況下,無法進一步簡化
  2. 如果表B的所有字段都用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.

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