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

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

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

select T1.ID,t1.name
from table1 t1
where  not exists (
   SELECT *
   FROM table2 t2
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 语句,因此可以使用以下替代方法:

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

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

2nbm6dog

2nbm6dog2#

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

select  p2.ID, p2.name       --pass3
 from
  (select p1.ID, p1.name     --pass2
     from
      (SELECT T1.ID, T1.name --pass1
         FROM Table1 T1
         LEFT JOIN Table2 T2 ON T2.ID1 = T1.ID    
        where T2.ID1 is null                        --not in ID1
      ) p1 LEFT JOIN Table2 T2 ON T2.ID2 = p1.ID 
    where T2.ID1 is null                            --also not in ID2
  ) p2 LEFT JOIN Table2 T2 ON T2.ID3 = p2.ID
where T2.ID1 is null                                --also not in ID3

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

yqhsw0fo

yqhsw0fo3#

SELECT DISTINCT ID,NAME
FROM
(SELECT T1.ID, T1.name
    FROM Table1 T1
    LEFT OUTER JOIN Table2 T2 ON T2.ID1 = T1.ID
where T2.ID1 is null
union
SELECT T1.ID, T1.name
    FROM Table1 T1
    LEFT OUTER JOIN Table2 T2 ON T2.ID2 = T1.ID
where T2.ID2 is null
union
SELECT T1.ID, T1.name
    FROM Table1 T1
    LEFT OUTER JOIN Table2 T2 ON T2.ID3 = T1.ID
where T2.ID3 is null)JO

相关问题