1

2 つのテーブルがあり、2 番目のテーブルのすべての値が除外されるようにそれらを結合したいと考えています。両方のテーブルを結合すると、テーブル 1 の値のみが必要になり、両方のテーブルの値やテーブル 2 の値は必要ありません。

これは LEFT JOIN または LEFT OUTER JOIN で行われると思っていましたが、奇妙な発見がいくつかあります。

すべてのデータを確認すると、次のカウントがあります。

-- TOTAL LEADS: 10067
SELECT COUNT(*) FROM sold_leads AS sl 
WHERE sl.affiliate_id IN(1000,1001,1002,1033) 
AND sl.create_date >= '2013-1-1' 
AND sl.lead_type = 'AUTO'; 

ただし、表 1 の値だけを見つけようとすると、より高い数値が見つかりますが、これは不可能です。

 -- How many had No suspension/dui, sr22, and <=2 accidents AND <=2 tickets: 13931
 SELECT COUNT(*) FROM sold_leads AS sl
 INNER JOIN drivers AS dr ON sl.lead_id = dr.lead_id
 LEFT OUTER JOIN duis AS duis ON sl.lead_id = duis.driver_id
 LEFT OUTER JOIN accidents AS ac ON sl.lead_id = ac.driver_id  
 WHERE sl.affiliate_id IN(1000,1001,1002,1033)
 AND sl.create_date >= '2013-1-1'
 AND dr.relationship_type = 'SELF';

合計数が、いくつかのテーブルを結合していくつかの制限を追加した場合の数よりも少なくなる方法はありません. 私は何を間違っていますか。

また、スキーマを提供していないことはわかっていますが、2 つ以下の事故だけを選択するにはどうすればよいでしょうか。driver_id を持つ事故テーブルがありますが、HAVING(COUNT(*)) のさまざまなバリエーションで遊んだことがありますが、うまくいきませんでした。

ヘルプ!?

4

2 に答える 2

2

除外結合には通常、外部結合テーブルで一致しないものに結果を制限する条件があります。

SELECT COUNT(*) FROM sold_leads AS sl
INNER JOIN drivers AS dr ON sl.lead_id = dr.lead_id
LEFT OUTER JOIN duis AS duis ON sl.lead_id = duis.driver_id
LEFT OUTER JOIN accidents AS ac ON sl.lead_id = ac.driver_id  
WHERE sl.affiliate_id IN(1000,1001,1002,1033)
AND sl.create_date >= '2013-1-1'
AND dr.relationship_type = 'SELF'
-- these are the exclusion join tests:
AND duis.driver_id IS NULL AND ac.driver_id IS NULL

@ConradFrix からのコメントも良いです。driversの行ごとに 1 行を超える場合sold_leads、乗算効果が得られる可能性があるため、何かが一意の列であるCOUNT(DISTINCT sl.something)場所を返すことをお勧めします。

参加条件についてもよくわかりません。duis.driver_id と ac.driver_id を sl.lead_id と比較しています。ただし、dr.lead_id は sl.lead_id とも比較されます。これらの条件のいずれかが正しくありませんか? もちろん、あなたは自分のスキーマを私よりよく知っていますが、列名に一貫性がないようです。

于 2013-02-13T05:42:54.030 に答える
1

driversduis、またはaccidentsに同じ が含まれる行が複数ある場合lead_id、結果には同じ が含まれる行が複数lead_idあり、行の総数が増えます。おそらく、これを where 句に追加するつもりでした:

AND     duis.lead_id IS NULL
AND     ac.lead_id IS NULL

またはにsold_leads一致するレコードがないことのみが必要な場合は、これらのテーブルに直接結合するのではなく、サブクエリを使用する方が明確な場合があります。この質問で、いくつかの例といくつかの代替案の説明を見ることができます。duisaccidentsNOT IN

于 2013-02-13T05:40:49.140 に答える