[英]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:
因此,您的加入條件可以是:
[...]
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.