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

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

我有三张table。

  1. t1
  2. Name | Version | ...
  3. A 1
  4. A 2
  5. B 1
  6. B 3
  7. t2
  8. Name | Version | ...
  9. A 1
  10. A 3
  11. B 2
  12. B 3
  13. t3
  14. Name | Version | ...
  15. A 1
  16. A 2

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

  1. SELECT c.name,c.version FROM
  2. (SELECT name,version from t1
  3. UNION
  4. SELECT name,version from t2
  5. ) c

这是回报

  1. result
  2. Name | Version
  3. A 1
  4. A 2
  5. A 3
  6. B 1
  7. B 2
  8. B 3

我想要的是什么

  1. wanted result
  2. Name | Version
  3. A 3
  4. B 1
  5. B 2
  6. B 3

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

omjgkv6w

omjgkv6w1#

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

  1. SELECT c.name,c.version
  2. FROM
  3. (SELECT name,version from t1
  4. UNION
  5. SELECT name,version from t2
  6. ) c
  7. INNER JOIN t3 on c.name<>t3.name and c.version<>t3.version
g9icjywg

g9icjywg2#

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

  1. SELECT c.name,c.version
  2. FROM
  3. (SELECT name,version from t1
  4. UNION
  5. SELECT name,version from t2
  6. ) c
  7. LEFT JOIN t3 on c.name=t3.name and c.version=t3.version
  8. WHERE t3.name is NULL --do not exist in t3 table
  9. ;

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

  1. SELECT c.name,c.version
  2. FROM
  3. (SELECT name,version from t1
  4. UNION
  5. SELECT name,version from t2
  6. ) c
  7. WHERE NOT EXISTS (SELECT 1 FROM t3 WHERE c.name=t3.name and c.version=t3.version)
  8. ;
展开查看全部

相关问题