我有两个表,希望以这样的方式将它们连接在一起,以排除第二个表中的所有值。当我加入两个表时,我只想要表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';
总计数不会低于我离开加入某些表并添加一些限制的计数。我做错了什么。
另外,我知道我没有提供架构,但我如何只选择&lt; = 2次事故。 有一个有一个driver_id的事故表,但是我玩了不同的HAVING(COUNT(*))且没有运气。
帮助!?
答案 0 :(得分: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
中每行sold_leads
包含&gt; 1行,则可以获得乘法效果,因此最好返回COUNT(DISTINCT sl.something)
某些内容是独特的专栏。
我对你的加入条件也不太确定,你将duis.driver_id和ac.driver_id与sl.lead_id进行比较。但是dr.lead_id也与sl.lead_id进行了比较。这些条件中的一个或另一个是不正确的吗?当然,您比我更了解您的架构,但看起来列名不一致。
答案 1 :(得分:1)
如果drivers
,duis
或accidents
包含多个具有相同lead_id
的行,则您的结果将包含多个具有相同lead_id
的行1}},您将增加总行数。你可能想把它添加到你的where子句:
AND duis.lead_id IS NULL
AND ac.lead_id IS NULL
如果您只希望在sold_leads
或duis
中没有匹配记录的accidents
,那么使用NOT IN
和子查询而不是使用子查询可能会更加清晰直接加入这些表。您可以在this question中看到一些示例和一些替代方案的讨论。