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。基本上,IN
或 NOT 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 接收已经减少的数据集,此解决方案可能适用于大表。
我有两个表 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。基本上,IN
或 NOT 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 接收已经减少的数据集,此解决方案可能适用于大表。