选择其他表中不存在的列sql中的多个列

jyztefdp  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(471)

我有两个表table1具有id、name,table2具有id1、id2和id3、name1、name2和name3。我要选择table1。表2中不存在id:id1、id2和id3

  1. select T1.ID,t1.name
  2. from table1 t1
  3. where not exists (
  4. SELECT *
  5. FROM table2 t2
  6. where t1.ID=t2.ID1 or t1.ID=t2.ID2 or or t1.ID=t2.ID3 )

我收到此查询的错误消息

tp5buhyn

tp5buhyn1#

经过一点研究,我发现了这个。基本上,一个查询中的子查询不能有多个列 IN 或者 NOT IN 中的条件 WHERE 条款。这就是查询当前失败的原因:子查询从表2中获取所有列。
根据我对您的问题的理解,您希望选择结果将是表2中不存在的元素的位置。
为此,您只需使用 LEFT OUTER JOIN . 在sql中,我会将join保留在所有三列上,但hive似乎不支持中的多个条件 JOIN 语句,因此可以使用以下替代方法:

  1. SELECT T1.ID, T1.name
  2. FROM Table1 T1
  3. LEFT JOIN Table2 T2_1 ON T2_1.ID1 = T1.ID
  4. LEFT JOIN Table2 T2_2 ON T2_2.ID2 = T1.ID
  5. WHERE (T2_1.id IS NULL) AND -- the id of Table2 - T2_1
  6. (T2_2.id IS NULL) -- the id of Table2 - T2_2

只要加上一样多 LEFT JOIN 以及 WHERE 子句,因为您有要检查的列。
下面是这个查询概念(数据不同,但概念不同)。

2nbm6dog

2nbm6dog2#

先加入 ID1 ,然后通过 ID2 ,然后通过 ID3 :

  1. select p2.ID, p2.name --pass3
  2. from
  3. (select p1.ID, p1.name --pass2
  4. from
  5. (SELECT T1.ID, T1.name --pass1
  6. FROM Table1 T1
  7. LEFT JOIN Table2 T2 ON T2.ID1 = T1.ID
  8. where T2.ID1 is null --not in ID1
  9. ) p1 LEFT JOIN Table2 T2 ON T2.ID2 = p1.ID
  10. where T2.ID1 is null --also not in ID2
  11. ) p2 LEFT JOIN Table2 T2 ON T2.ID3 = p2.ID
  12. where T2.ID1 is null --also not in ID3

第2步和第3步上的连接将从t1接收已经减少的数据集,这个解决方案可能适合于大型表。

yqhsw0fo

yqhsw0fo3#

  1. SELECT DISTINCT ID,NAME
  2. FROM
  3. (SELECT T1.ID, T1.name
  4. FROM Table1 T1
  5. LEFT OUTER JOIN Table2 T2 ON T2.ID1 = T1.ID
  6. where T2.ID1 is null
  7. union
  8. SELECT T1.ID, T1.name
  9. FROM Table1 T1
  10. LEFT OUTER JOIN Table2 T2 ON T2.ID2 = T1.ID
  11. where T2.ID2 is null
  12. union
  13. SELECT T1.ID, T1.name
  14. FROM Table1 T1
  15. LEFT OUTER JOIN Table2 T2 ON T2.ID3 = T1.ID
  16. where T2.ID3 is null)JO

相关问题