我有2個表,合同和推銷員。 最近我發現的一些數據錯誤,有些合同在「推銷員」未找到salesid的,我懷疑意外刪除或某種形式的輸入錯誤。我需要哪種類型的連接?
其中加入我應該用發現不所有合同「屬於」的推銷員,換句話說,該contract.salesid不是在salesmen.id列中找到。
這應該是一個右外連接,但結果的arent正確的來了。
我有2個表,合同和推銷員。 最近我發現的一些數據錯誤,有些合同在「推銷員」未找到salesid的,我懷疑意外刪除或某種形式的輸入錯誤。我需要哪種類型的連接?
其中加入我應該用發現不所有合同「屬於」的推銷員,換句話說,該contract.salesid不是在salesmen.id列中找到。
這應該是一個右外連接,但結果的arent正確的來了。
SELECT c.contract_id FROM contract c
LEFT OUTER JOIN salesmen s ON s.salesman_id = c.salesman_id
WHERE c.salesman_id IS NULL
將是我的猜測。
left outer join
如果你是從合同,業務員加盟
編輯:有大約走錯路
所以'select * from contracts c left outer join sales s s on c.salesid = s.id'will work?我嘗試過,但我得到的結果中的整個表。 – bikey77
啊對不起,我誤解了這個問題。如果他們存在,我曾假設你想讓合同銷售人員簽約。如果你想找到失蹤的推銷員,使用不存在的where子句將是最簡單的 –
順序如果您正在尋找contract.salesid
在salesmen.id
沒有找到,你可以使用NOT IN()
而不是加盟。
SELECT * FROM contracts WHERE salesid NOT IN (SELECT id FROM salesmen);
以上將來自具有不匹配現有salesmen.id
salesid
contracts
返回的一切。在大表使用NOT IN()
可能比一個JOIN
做慢,但如果你的表是不是太大,通常是使用(在我看來)更直接的方法。
邁克爾,你的建議完美的作品。不過,我會接受來自0xCAFEBABE的答案,因爲我主要對JOIN語法感興趣。感謝您的時間。 – bikey77
@ bikey77:查看launcge的答案,爲什麼JOIN語法不總是最好的選擇。 –
外部聯接確實可以做到這一點,但爲什麼不乾脆:
select *
from contract c
where c.salesid not in (select s.id
from salesmen s)
我想這就是答案:
select * from Contract c
right outer join Salesmen s on (c.salesid = s.id)
這會給你一份所有合同的清單;如果條件不匹配,銷售員列將爲NULL。 –
你讀過這個問題了嗎? 「我應該使用哪種加盟發現不屬於‘’進賬所有合同」 –
你不明白 - ** **所有的記錄,用戶必須注意空值就知道什麼不屬於。大多數只是想要不屬於的記錄;) –
聽起來你正在尋找一個「反連接」。關於三種方式在MySQL做到這一點Explain Extended會談:
WHERE __ IS NULL
NOT IN
與子查詢子句。NOT EXISTS
子句與子查詢。+1:對於ExplainExtended鏈接,但不要忘記[這一個,關於列何時可以爲空](http://explainextended.com/2010/05/27/left-join-is-null-vs-not-in-vs-not-exists-nullable-columns /) –
+1用於抗連接(又名半差異)@OMGPonies:似乎有關與特徵相關的空語義的文章比關於該功能本身的文章更長! 「避免空值」廣告系列的廣告:) – onedaywhen
請發表表格結構 – cdeszaq