SQL新手。
我有两个SQL表T1和T2,如下所示
T1
customer_key X1 X2 X3
1000         60 10  2018-02-01
1001         42 9   2018-02-01
1002         03 1   2018-02-01
1005         15 1   2018-02-01
1002         32 2   2018-02-05
T2
customer_key A1 A2 A3
1001         20 2  2018-02-17
1002         25 2  2018-02-11
1005         04 1  2018-02-17
1009         02 0  2018-02-17我希望通过连接T1和T2并过滤T1.X3 = '2018-02-01‘和T2.A3 = '2018-02-17’来获得如下所示的T3
T3
customer_key X1    X2 
1000         60    10
1001         42    9
1005         15    1
1009         null null我试着用下面的方法做完全的外连接
create table T3
AS
select T1.customer_key, T3.customer_key, T1.X1, T1.X2
from T1
full outer join T2
on T1.Customer_key = T2.customer_key 
where T1.X3 = '2018-02-01' and T2.A3 = '2018-02-17'它返回的行数少于满足where子句的记录总数。敬请指教
发布于 2020-08-25 09:10:25
带有筛选的完全外连接只会让人感到困惑。我建议在子查询中进行过滤:
select T1.customer_key, T3.customer_key, T1.X1, T1.X2
from (select t1.*
      from T1
      where T1.X3 = '2018-02-01'
     ) t1 full outer join
     (select t2.*
      from T2
      where T2.A3 = '2018-02-17'
     ) t2
     on T1.Customer_key = T2.customer_key ;您的筛选器会将外连接转换为内连接。将条件移动到on子句将返回两个表中的所有行--但通常具有大量的null值。使用(T1.X3 = '2018-02-01' or t1.X3 is null) and (T2.A3 = '2018-02-17' or T2.A3 is null)也不能做正确的事情。首先过滤就是你要找的东西。
发布于 2020-08-25 09:37:50
当您通过FULL OUTER JOIN联接表时,查询引擎将查找所有匹配的记录(INNER JOIN),并将两个表中任何不匹配的记录添加到JOIN结果集中。后者在另一个表的所有列中都有NULL。
例如,T1中的customer = 1000将包含在JOIN结果中,尽管T2中没有这样的客户,但T2中的所有列都将为NULL (由于FULL OUTER)。然后,当您对这些记录应用WHERE子句时(WHERE是在JOIN操作之后执行的),您的结果集将排除customer = 1000,因为T2.A3 = '2018-02-17'将失败(因为T2.A3对于customer = 100是NULL )。
我无法对您的问题提出疑问,因为您的解释缺少您试图实现的目标,并且我无法理解您的结果集:例如,为什么包含customer = 1000而不包含customer = 1002。请描述一下你想要实现的目标。
根据您试图完成的任务,您可以将WHERE子句的一部分移动到JOIN,或者使用像T1.customer is NULL / T1.customer is NOT NULL这样的过滤器来识别记录不匹配/不匹配的情况,并准确地过滤您需要的内容。
https://stackoverflow.com/questions/63570652
复制相似问题