我创建了两个Hive外部表(SQL查询可以工作),它指向我需要比较两个输出的位置。
我需要比较两个表并选择不匹配的记录。
id sdate edate tag
S1 20180610 20180611 0
S2 20180610 20180612 0
S3 20180612 20180613 0
S5 20180612 20180613 1
id sdate edate tag
S1 20180610 20180611 0
S2 20180611 20180612 0
S3 20180612 20180613 1
S4 20180612 20180613 1
S3 20180612 20180613 0
S5 20180612 20180613 1
S4 20180612 20180613 1
尝试通过加入两个表来编写查询,但确实为我工作。
感谢您的帮助
谢谢:)
答案 0 :(得分:0)
此查询将帮助您以有效的方式识别记录
create table unmatched as
select
a.*
from tableA as a left join (select *, true as flag from tableB) as b on
a.id=b.id a.sdate=b.sdate a.edate=b.edate a.tag=b.tag
where b.flag is null --this will get records in tableA but not in table B
union all
select
b.*
from tableB as b left join (select *, true as flag from tableA) as a on
a.id=b.id a.sdate=b.sdate a.edate=b.edate a.tag=b.tag
where a.flag is null --this will get records in tableB but not in table A
;
您可以使用完整联接执行此操作,但效率会低得多
答案 1 :(得分:0)
我们可以使用以下查询轻松完成此操作。
请注意,我不确定为什么要从输出中消除s2,因为它在两个表中明显不同。
此外,如果要在两个表中找到不同的记录,则S3将出现两次,因为两种情况下标志值都不同。
您可以修改以下查询并根据需要获取结果。 因为我们只加入这些表一次,这比连接两次表现要好得多。
select distinct
case when a.id is not null then a.id else b.id end as id,
case when a.sdate is not null then a.sdate else b.sdate end as sdate,
case when a.edate is not null then a.edate else b.edate end as edate,
case when a.tag is not null then a.tag else b.tag end as tag,
case when a.id is not null then 'table1' else 'table2' end as tb_id
from table1 a
full join table2 b
on a.id=b.id
and a.sdate=b.sdate
and a.edate=b.edate
and a.tag=b.tag
where (a.id is null
and a.sdate is null
and a.edate is null
and a.tag is null)
or (b.id is null
and b.sdate is null
and b.edate is null
and b.tag is null)
答案 2 :(得分:-1)
select * from (select * from tableA
union DISTINCT
select * from tableB) as finalTable
where id not in (select * from tableA t1 join tableB t2
on t1.is=t2.id and t1.sdate=t2.sdate and t1.edate=t2.edate and t1.tag=t2.tag);
第一个联合DISTINCT行并使 finalTable 。它有所有独特的行。
然后在两个表之间进行内连接。
最后减去他们,现在你得到了答案。
exmaple:
如果你先减去第二个,那么你就得到了 的 [1,4] 强> 你想要的是什么