我有以下查询,其中我需要拥有第一个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
答案 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;