左联接不产生结果

时间:2018-06-26 19:51:50

标签: sql impala

我有以下查询,其中我需要拥有第一个table1和 table2的对应值。如果值不存在,则返回NULL。 但是我只得到结果中返回的普通记录。

select 

distinct s1.src_sys_id schema_nm,
to_date(CAST(CAST(s3.execn_ts AS BIGINT)/1000 AS TIMESTAMP)) as maxtime
from table1 s1

LEFT JOIN table2 s3 ON s1.src_sys_id = s3.src_sys_id

INNER JOIN 
(
  SELECT src_sys_id, max(execn_ts) as maxtime
  FROM table2
  GROUP BY src_sys_id 
) s2 on s2.src_sys_id = s1.src_sys_id and s1.execn_ts = s2.maxtime  

table1

schema_nm   
GA1P    
GG60    
GGDD    
GWY1    
GXO1    
GYY1    
GHOD    

table2

schema_nm   execn_ts
GA1P    10/1/2018
GG60    10/2/2018
GGDD    10/3/2018

当前结果

schema_nm   maxtime
GA1P    10/1/2018
GG60    10/2/2018
GGDD    10/3/2018

预期结果

schema_nm   maxtime
GA1P    10/1/2018
GG60    10/2/2018
GGDD    10/3/2018
GWY1    NULL
GXO1    NULL
GYY1    NULL
GHOD    NULL

2 个答案:

答案 0 :(得分:0)

我认为您真正的问题的答案是使用窗口函数:

select s1.src_sys_id schema_nm,
       to_date(CAST(CAST(s3.execn_ts AS BIGINT)/1000 AS TIMESTAMP)) as maxtime
from table1 s1 left join
     (select s2.*,
             row_number() over (partition by s2.src_sys_id order by s2.execn_ts desc) as seqnum
      from table2 s2
     ) s2
     on s1.src_sys_id = s2.src_sys_id and s2.seqnum = 0;

查询过滤掉行的原因有些棘手。 left join很好。甚至inner join都很好。 。 。就目前而言。但是,两个联接都在同一个表中。因此,如果第一个join不存在匹配行,则第二个不存在该行。

换句话说,inner join会过滤掉与left join中不匹配的行相同的行。

总而言之,窗口函数是一种更好的方法,尽管再次使用left join也可以解决您的问题。

答案 1 :(得分:0)

您的第一个LEFT JOIN是多余的:

select s1.src_sys_id schema_nm,
       to_date(CAST(CAST(s2.execn_ts AS BIGINT)/1000 AS TIMESTAMP)) as maxtime
from table1 s1 left join (
     select s2.src_sys_id, max(s2.execn_ts) as execn_ts
     from table2 s2
     group by s2.src_sys_id
) s2 on s1.src_sys_id = s2.src_sys_id; 
        --s2.execn_ts = s1.execn_ts;