簡體   English   中英

MySQL的左外連接排除

[英]mysql left outer join exclude

我有2個表' conta '和' details ',並且兩個表在不同情況下都具有空值和數據

conta
id  col1  col2  col3  col4
1  Hi  Bye  See YOU  
2  Hello  (NULL)  (NULL)  (NULL)

details

id  new_column1  new_column2  new_column3
1  bye  see  you

我想根據申請加入col2=new_column1 and col3 = new_column2 and col4 = new_column3和獲取存在於價值conta而不是details ,所以我的輸出將是

conta
id  col1  col2  col3  col4
2  hello  (NULL)  (NULL)  (NULL)

但是我無法做到這一點。 我在下面的查詢中編寫了代碼,但它根本無法為我提供所需的值。

SELECT `id`,`col1`,`col2`,`col3`,`col4` FROM `conta`
WHERE LOWER(`col2`) + LOWER(`col3`) + LOWER(`col4`) NOT IN (SELECT DISTINCT(LOWER(`new_column1`) + LOWER(`new_column2`) + LOWER(`new_column3`))
 FROM `details`);

它根本沒有結果! 在顯示器上

有什么幫助嗎?

編輯:我嘗試了以下查詢,如@Uueerdo所建議,它沒有給我我想要的東西。

SELECT conta.id,`col1`,`col2`,`col3`,`col4` FROM `conta`
LEFT OUTER JOIN `details`
ON ((conta.col2 IS NULL AND details.new_column1 IS NULL) 
    OR (LOWER(conta.col2) = LOWER(details.new_column1)))
AND ((conta.col3 IS NULL AND details.new_column2 IS NULL) 
    OR (LOWER(conta.col3) = LOWER(details.new_column2)))
AND ((conta.col4 IS NULL AND details.new_column3 IS NULL) 
    OR (LOWER(conta.col4) = LOWER(details.new_column3)))
WHERE details.id IS NULL

col2的輸出中,我看到一個值“ Operations ”,該值也出現在details表的new_column1中。 這意味着它不應該出現在輸出中,因為我嘗試應用左外部聯接,我什至嘗試使用LEFT JOIN代替LEFT OUTER JOIN,並且它也不起作用

Edit2 :我找到了解決方案。 查詢工作並完成工作。 舉例來說,我必須運行一個命令來替換我將Join應用於NULL值的列中的所有空白單元格。

您最好使用SELECT .... FROM a LEFT JOIN b ON conditions WHERE b.id IS NULL樣式的查詢SELECT .... FROM a LEFT JOIN b ON conditions WHERE b.id IS NULL 空比較略有不同(可以處理聯接條件)。

例如,這些計算結果為NULL,這不是true,這是false:

  • NULL = NULL
  • 空輸入(NULL)

但是您可以執行以下操作以更輕松地比較null:

  • ISNULL(a,x)= ISNULL(b,x)
  • (a為NULL,b為NULL)

因此,您的加入條件可以是:

[...]
ON ((conta.col2 IS NULL AND details.new_column1 IS NULL) 
    OR (LOWER(conta.col2) = LOWER(details.new_column1)))
AND ((conta.col3 IS NULL AND details.new_column2 IS NULL) 
    OR (LOWER(conta.col3) = LOWER(details.new_column2)))
[and so on...]
WHERE details.id IS NULL

假設details具有某種非空行標識字段,可用於可靠地確定是否存在匹配項。


編輯:當前查詢的確切問題(除了我之前概述的空問題之外)是+不是MySQL中的串聯,而是加法。 對於數據,您已經為其中沒有NULL值的行顯示了LOWER(col2) + LOWER(col3) + LOWER(col4)LOWER(new_column1) + LOWER(new_column2) + LOWER(new_column3)且產量為0 您將需要使用CONCAT()函數代替該操作; 但我不建議這樣做,因為CONCAT('abc', 'def', '')等於CONCAT('ab', 'cd', 'ef')

旁注: DISTINCT不是函數, ()將無效( 除非它們包含多個結果字段會導致問題 )。


您可以使用以下格式進行簡單的更改來保留常規格式以及上述空問題: WHERE (a, b, c) IN (SELECT a, b, c FROM ....

您可以進行左聯接,然后在第二張表中測試是否為空,以查找第一張表中與第二張表中任何行都不匹配的行。

SELECT 
    a.`id`,
    a.`col1`,
    a.`col2`,
    a.`col3`,
    a.`col4` 
FROM `conta` a
LEFT JOIN `details` b
ON a.`col2` like b.`new_column1`
    AND a.`col3` like b.`new_column2`
    AND a.`col4` like b.`new_column3`
WHERE b.`id` IS NULL

您可以使用EXISTS運算符創建反半聯接。 請查看以下鏈接: https : //www.techonthenet.com/mysql/exists.php

查詢示例:

SELECT
    id,
    col1,
    col2,
    col3,
    col4
FROM conta
WHERE NOT EXISTS (
    SELECT 1
    FROM details
    WHERE conta.col2 LIKE details.new_column1
        AND conta.col3 LIKE details.new_column2
        AND conta.col4 LIKE details.new_column3
)

您的問題解決方案是將(聯系表)與(詳細信息表)內部連接,並獲得(contact。*)所有列,其中Contact.col1!= details.new_column1

這是一個查詢

Select conta.* from conta inner join details on conta.col1!=details.new_column1

您可以並且在內部聯接中的更多位置列

暫無
暫無

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

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