select 另一个表中不存在一个列 sql 中的多个列

select a columns not exist in another tables multiple columns in sql

我有两个表 Tables1,ID 为 name,Table2 有 ID1、ID2 和 ID3,name1、name2 和 name3。 我想 select table1.ID 表 2 中不存在: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  )

我收到此查询的错误消息

经过一番研究,我找到了 this。基本上,INNOT IN 子句中的子查询不能有多个列 WHERE 子句。这就是您的查询当前失败的原因:您的子查询从 Table2 中获取所有列。


根据我对你问题的理解,你想要一个 select 结果将是表 2 中不存在的元素。

为此,您只需使用 LEFT OUTER JOIN。在 SQL 中,我将 left 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

只需在 WHERE 子句中添加与要检查的列一样多的 LEFT JOIN 和条件。

Here's a fiddle同这个查询概念(数据不一样,但是概念是)。

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

首先通过 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 接收已经减少的数据集,此解决方案可能适用于大表。