1

我有两个表,并希望以排除第二个表中的所有值的方式将它们连接在一起。当我加入两个表时,我只需要表 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

如果drivers, duis, 或accidents有不止一行相同lead_id,那么您的结果将有不止一行相同lead_id,并且您将增加总行数。您可能打算将此添加到您的 where 子句中:

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

如果您只希望在orsold_leads中没有匹配的记录,那么使用和子查询可能会更清楚,而不是直接加入这些表。您可以在这个问题中看到一些示例和一些替代方案的讨论。duisaccidentsNOT IN

于 2013-02-13T05:40:49.140 回答