hive:如何只从两个表中的两列中选择不在第三个表中的不同值?

taor4pac  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(314)

我有三张table。

t1
Name | Version | ...
A        1 
A        2
B        1
B        3

t2
Name  | Version | ...
 A        1
 A        3
 B        2
 B        3

 t3 
 Name  | Version | ...
  A         1
  A         2

我想从表1和表2中选择表3中不存在的不同名称和版本值。
我当前的select查询从表1和表2中选择不同的值

SELECT c.name,c.version FROM 
   (SELECT name,version from t1 
    UNION   
    SELECT name,version from t2
    ) c

这是回报

result
 Name  | Version
  A        1
  A        2 
  A        3
  B        1
  B        2
  B        3

我想要的是什么

wanted result
Name | Version
  A      3
  B      1
  B      2
  B      3

如何正确修改hql查询以获得此结果?谢谢你的帮助。

omjgkv6w

omjgkv6w1#

您可以在连接条件中使用<>

SELECT c.name,c.version 
  FROM 
   (SELECT name,version from t1 
    UNION   
    SELECT name,version from t2
    ) c
  INNER JOIN t3 on c.name<>t3.name and c.version<>t3.version
g9icjywg

g9icjywg2#

对t3表使用左联接+仅筛选未联接的行:

SELECT c.name,c.version 
  FROM 
   (SELECT name,version from t1 
    UNION   
    SELECT name,version from t2
    ) c
  LEFT JOIN t3 on c.name=t3.name and c.version=t3.version
WHERE t3.name is NULL --do not exist in t3 table
;

另一种可能的方法是使用not exists:

SELECT c.name,c.version 
  FROM 
   (SELECT name,version from t1 
    UNION   
    SELECT name,version from t2
    ) c
WHERE NOT EXISTS (SELECT 1 FROM t3 WHERE c.name=t3.name and c.version=t3.version)
;

相关问题