2017-06-19 84 views
0

我有2代表「conta」和「details」和兩個表在不同的情況下,空值和數據MySQL的左外連接排除

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我看到的值「操作」,其也存在於new_column1details表。這意味着,因爲我想申請左外連接排除我甚至使用LEFT JOIN代替LEFT OUTER JOIN試過它不應該存在於輸出和它不工作要麼

EDIT2:我找到了解決方案。查詢工作並完成這項工作。 Exept,我不得不運行一個命令來替換我應用連接到NULL值的列中的所有空白單元格。

+0

我認爲您需要清理一下您的示例數據;它看起來像第一行的5個字段中有6個值。 – Uueerdo

+0

我的不好!我剛剛糾正了這一點。我其實很好奇,知道爲什麼它不給我想要的結果。我的意思是我的查詢出了什麼問題。 – Enthusiast

+0

請參閱編輯我的答案。 – Uueerdo

回答

1

你最好用SELECT .... FROM a LEFT JOIN b ON conditions WHERE b.id IS NULL風格的查詢;空比較有點不同(並且可以處理連接條件)。

例如,這些計算爲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中串聯,這是加法。使用數據顯示LOWER(col2) + LOWER(col3) + LOWER(col4)LOWER(new_column1) + LOWER(new_column2) + LOWER(new_column3)以及產量0的行中沒有NULL值。您需要使用CONCAT()函數來執行操作;但我會勸阻它,因爲CONCAT('abc', 'def', '')等於CONCAT('ab', 'cd', 'ef')

旁註:DISTINCT不是一個功能,()將沒有效果(比,如果他們包含不止一個結果場可能會導致一個問題等)。


你可以把你的一般格式,和上述空問題,用此格式的簡單變化:WHERE (a, b, c) IN (SELECT a, b, c FROM ....

+0

我經歷了你的建議,它不起作用。我已將我的語法和關注添加到我的文章中 – Enthusiast

+0

沒關係,我找到了問題。有一些單元格除NULL值外還有空格。您的解決方案有效。 – Enthusiast

-1

您可以使用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 
) 
-1

你的問題的解決辦法是內加入您的(通訊錄)與(詳細信息表) 並獲得所有列其中(接觸。*) Contact.col1!= details.new_column1

這裏是一個查詢

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

你可以和更多凡內柱加入

+0

如果您有任何問題評論請 –

+0

您的查詢正在獲取所有'conta',其中有些內容與'details'中的內容不匹配;與'details'中沒有匹配的'conta'相反。另外,你的第一句話沒有多大意義。我會把它記在翻譯問題上,但不知道爲什麼「contact。*」應該被提及。 – Uueerdo

0

您可以執行左連接,然後在第二個表中測試空值以查找第一個表中與第二個表中的任何行不匹配的行。

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