SQL Left Join不会返回所有结果

时间:2017-09-06 05:51:12

标签: sql left-join

我正在尝试为正在进行流程的客户加入两个表。所有客户都进入第一步,但只有一些进展到第二步(表2)。 客户可以在不同时间多次启动此过程,并且可以在无,一个或多个月内进入第二步。我想知道有多少人取得这样的进展。 表格为例:

TABLE_1

Cust1    1-Jan    
Cust2    10-Jan
Cust3    15-Jan
Cust1    2-Feb

TABLE_2

Cust1    5-Jan
Cust2    16-jan

我的返回结果的查询是:

SELECT t1.Cust, t1.Date1, t2.Date2
FROM Table_1 t1
LEFT JOIN Table_2 t2 ON t1.Cust = t2.Cust
WHERE t2.Date is missing OR (t2.Date - t1.Date > 0 AND t2.Date - t1.Date < 10);

返回:

Cust1  1-Jan    5-Jan
Cust2  10-Jan   16-Jan
Cust3  15-Jan

当我想要返回的查询是:

Cust1  1-Jan    5-Jan
Cust1  2-Feb
Cust2  10-Jan   16-Jan
Cust3  15-Jan

查询似乎将2月2日和5月1日加入Cust1,然后将其删除,因为它与过滤器不匹配。但我需要过滤器,因为Cust1在三月份回来了。如何将这个二月份的条目保留在最终输出中?救命!

3 个答案:

答案 0 :(得分:5)

where条件放入on子句:

SELECT t1.Cust, t1.Date1, t2.Date2
FROM Table_1 t1
LEFT JOIN Table_2 t2 ON t1.Cust = t2.Cust 
                    AND t2.Date - t1.Date > 0 
                    AND t2.Date - t1.Date < 10

答案 1 :(得分:3)

我想,客户可以每月开始一次流程(至少是我观察到的流程),所以可以联系起来:

SELECT t1.Cust, t1.Date1, t2.Date2
FROM Table_1 t1
LEFT JOIN Table_2 t2 ON (t1.Cust = t2.Cust AND DATEDIFF(MONTH, t1.Date1, t2.Date2) = 0)

通常情况下,您可以使用DATEDIFF指定更短的时间段,即如果您希望此差异小于10天,则可以使用:

DATEDIFF(DAY, t1.Date1, t2.Date2) <= 10

答案 2 :(得分:2)

  

查询似乎将2月2日和5月1日加入Cust1,然后将其删除,因为它与过滤器不匹配。

右!!这是因为,每当你在WHERE子句中使用LEFT JOINed Table时,这将改变LEFT JOIN的行为并充当INNER JOIN,并且你知道INNER JOIN只返回匹配的记录。

解决此问题的方法使用WHERE子句条件IN连接逻辑