【问题标题】:SQL Left Join does not return all resultsSQL Left Join 不返回所有结果
【发布时间】:2017-09-06 05:51:12
【问题描述】:

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

表_1

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

表_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

该查询似乎将 Cust1 与 2 月 2 日和 5 月 5 日联合起来,然后将其消除,因为它与过滤器不匹配。但我需要过滤器,因为 Cust1 在三月份回来。如何在最终输出中保留这个 2 月条目?帮助!

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 你应该将 where 条件放入 join:LEFT JOIN Table_2 t2 ON t1.Cust = t2.Cust and (t2.Date is missing OR (t2.Date - t1.Date &gt; 0 AND t2.Date - t1.Date &lt; 10))
  • 你的日期列数据类型是什么
  • 日期列只是一个日期列,为了实用,这里简化了。 DBMS 实际上是 SAS EG 中的 Proc SQL,但对于任何 SQL 都应该是相同的。

标签: sql left-join


【解决方案1】:

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

【讨论】:

  • 谢谢 - 快到了。对于那些不重复的客户,我需要 OR,即 t2.Date2 缺失。如果你改变我可以接受。
  • 好吧,left join 负责:它确保列出第一个表的所有记录,即使不能满足on 条件并且第二个表的字段将保持为空 (=null)。
【解决方案2】:

我想,客户可以每月启动一次流程(至少我观察到的),所以它可以加入:

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

【讨论】:

  • 看起来 DBMS 确实对此很重要 - Proc SQL 函数是 DATDIF 或 INTCK。还需要 Date2 缺失的条件。谢谢!
【解决方案3】:

该查询似乎将 Cust1 与 2 月 2 日和 5 月 5 日联合起来,然后将其消除,因为它与过滤器不匹配。

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

要解决此问题,请在加入逻辑中使用 WHERE 子句条件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2019-09-06
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多