2011-10-14 95 views
1

我有2個表,合同和推銷員。 最近我發現的一些數據錯誤,有些合同在「推銷員」未找到salesid的,我懷疑意外刪除或某種形式的輸入錯誤。我需要哪種類型的連接?

其中加入我應該用發現不所有合同「屬於」的推銷員,換句話說,該contract.salesid不是在salesmen.id列中找到。

這應該是一個右外連接,但結果的arent正確的來了。

+0

請發表表格結構 – cdeszaq

回答

0
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 

將是我的猜測。

0

left outer join如果你是從合同,業務員加盟

編輯:有大約走錯路

+0

所以'select * from contracts c left outer join sales s s on c.salesid = s.id'will work?我嘗試過,但我得到的結果中的整個表。 – bikey77

+0

啊對不起,我誤解了這個問題。如果他們存在,我曾假設你想讓合同銷售人員簽約。如果你想找到失蹤的推銷員,使用不存在的where子句將是最簡單的 –

3

順序如果您正在尋找contract.salesidsalesmen.id沒有找到,你可以使用NOT IN()而不是加盟。

SELECT * FROM contracts WHERE salesid NOT IN (SELECT id FROM salesmen); 

以上將來自具有不匹配現有salesmen.idsalesidcontracts返回的一切。在大表使用NOT IN()可能比一個JOIN做慢,但如果你的表是不是太大,通常是使用(在我看來)更直接的方法。

+0

邁克爾,你的建議完美的作品。不過,我會接受來自0xCAFEBABE的答案,因爲我主要對JOIN語法感興趣。感謝您的時間。 – bikey77

+1

@ bikey77:查看launcge的答案,爲什麼JOIN語法不總是最好的選擇。 –

0

外部聯接確實可以做到這一點,但爲什麼不乾脆:

select * 
from contract c 
where c.salesid not in (select s.id 
         from salesmen s) 
0

我想這就是答案:

select * from Contract c 
right outer join Salesmen s on (c.salesid = s.id) 
+0

這會給你一份所有合同的清單;如果條件不匹配,銷售員列將爲NULL。 –

+0

你讀過這個問題了嗎? 「我應該使用哪種加盟發現不屬於‘’進賬所有合同」 –

+0

你不明白 - ** **所有的記錄,用戶必須注意空值就知道什麼不屬於。大多數只是想要不屬於的記錄;) –

4

聽起來你正在尋找一個「反連接」。關於三種方式在MySQL做到這一點Explain Extended會談:

  • 左連接與WHERE __ IS NULL
  • 一個NOT IN與子查詢子句。
  • NOT EXISTS子句與子查詢。
+2

+1:對於ExplainExtended鏈接,但不要忘記[這一個,關於列何時可以爲空](http://explainextended.com/2010/05/27/left-join-is-null-vs-not-in-vs-not-exists-nullable-columns /) –

+0

+1用於抗連接(又名半差異)@OMGPonies:似乎有關與特徵相關的空語義的文章比關於該功能本身的文章更長! 「避免空值」廣告系列的廣告:) – onedaywhen