首页 > 解决方案 > SAS SQL Left join 基于条件而不删除表 A 中的行

问题描述

我有 2 个表,并希望根据特定条件将表 B 连接到 A

联接基于“ID”(a.ID = b.ID),但如果 b.status_date >= a.date,我只想从表 B 中引入 2 列“status_date”和“flag_y”

表 A:

+------------+-----+--------+
|    date    | ID  | Flag_x |
+------------+-----+--------+
| 01/03/2019 | 100 | x      |
| 01/03/2019 | 101 | x      |
| 02/03/2019 | 102 | x      |
| 02/03/2019 | 103 | x      |
+------------+-----+--------+

表 B:

+-------------+---------+--------+
| status_date | field_x | Flag_y |
+-------------+---------+--------+
| 15/03/2019  |     100 | y      |
| 10/01/2019  |     102 | y      |
+-------------+---------+--------+

期望的输出:

+------------+-----+--------+-------------+--------+
|    date    | ID  | Flag_x | status_date | Flag_y |
+------------+-----+--------+-------------+--------+
| 01/03/2019 | 100 | x      | 15/03/2019  | y      |
| 01/03/2019 | 101 | x      |             |        |
| 02/03/2019 | 102 | x      |             |        |
| 02/03/2019 | 103 | x      |             |        |
+------------+-----+--------+-------------+--------+

我在下面尝试的代码删除了 ID 102 的行,在这种情况下,我想保留此行但不从表 B 中引入信息,因为“status_date”在表 A 中的“日期”之前。我假设需要添加where子句中有什么东西???

PROC SQL;
Create Table Output As 
Select
a.*
,b.status_date
,b.flag_y

From Table_A as a
Left join Table_B as b
On b.ID = a.ID

Where b.status_date is Null or b.status_date >= a.date

;QUIT;

希望这是有道理的,有人可以提供帮助

标签: sqlsasleft-join

解决方案


请试试这个。

SELECT 
  a.*
  ,b.status_date
  ,b.flag_y
FROM 
   Table_A as a
 LEFT JOIN Table_B as b
   ON b.ID = a.ID
   AND b.status_date >= a.date

推荐阅读