Hive 选择另一个表中不存在的列sql中的多个列

Hive 选择另一个表中不存在的列sql中的多个列,hive,subquery,conditional-statements,not-exists,Hive,Subquery,Conditional Statements,Not Exists,我有两个表table1,ID为name,Table2有ID1、ID2和ID3、name1、name2和name3。 我想选择table1.ID不存在于Table2中: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 ) 我得到了这个查询的错

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

我得到了这个查询的错误信息

经过一点研究,我可以找到。基本上,WHERE子句中的in或NOT in条件中的子查询不能有多个列。这就是查询当前失败的原因:子查询从表2中获取所有列

根据我对您的问题的理解,您希望选择表2中不存在的元素作为结果

要做到这一点,您可以简单地使用左外部联接。在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
只需在WHERE子句中添加要检查的列数量的LEFT JOIN和条件


有了这个查询概念,数据就不一样了,但概念是一样的。

经过一番研究,我发现。基本上,WHERE子句中的in或NOT in条件中的子查询不能有多个列。这就是查询当前失败的原因:子查询从表2中获取所有列

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
根据我对您的问题的理解,您希望选择表2中不存在的元素作为结果

要做到这一点,您可以简单地使用左外部联接。在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
只需在WHERE子句中添加要检查的列数量的LEFT JOIN和条件

使用此查询概念,数据不同,但概念不同。

首先通过ID1连接,然后通过ID2连接结果数据集,然后通过ID3连接结果数据集:

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
第2步和第3步上的联接将从T1接收已缩减的数据集,此解决方案可能适用于大型表。

首先通过ID1联接,然后通过ID2联接结果数据集,然后通过ID3联接结果数据集:


第2步和第3步上的联接将从T1接收已缩减的数据集,此解决方案可能适用于大型表。

我想选择table1.ID不存在于Table2:ID1、ID2和ID3列中。从表1 t1中选择t1.ID,ti.name,其中t1.ID不在表2中,从表2 t2中选择t2.ID1,t2.ID2,t2.ID3它不工作。错误消息:子查询在选择列表中只能包含1项。然后,您可以使用或或ANDHi SIRY本人将多个条件添加到内部联接,在T2.ID1=T1.ID或T2.ID2=T1.IDI上不受支持。选中此项后,查询将与两个左联接一起工作。我将编辑我的应答HI Simyself,左联接一个很好,你能编辑你的答案吗?我会接受答案为“谢谢”。我想选择表1。表2中不存在ID:ID1、ID2和ID3列。从表1 t1中选择t1.ID,ti.name,其中t1.ID不在表2中,从表2 t2中选择t2.ID1,t2.ID2,t2.ID3它不工作。错误消息:子查询在选择列表中只能包含1项。然后,您可以使用或或ANDHi SIRY本人将多个条件添加到内部联接,在T2.ID1=T1.ID或T2.ID2=T1.IDI上不受支持。选中此项后,查询将与两个左联接一起工作。我将编辑我的应答HI Simyself,左联接一个很好,你能编辑你的答案吗?我会接受的答案是:你很可能从这个查询中得到重复的答案,你会分别过滤3列,这意味着你可能会得到id等于ID1、ID2或ID3之一的数据。他需要或条件而不是和条件。我认为你在蜂巢里没有工作知识。Hive中有一些限制。我想我有足够的知识来真正了解这个查询的作用。即使配置单元中存在限制,通过此查询,您也可以获取至少在三列之一中未引用过一次的任何数据。因此,它根据OP的需要提供了太多的数据。很可能您从该查询中获得了重复数据,并对3列进行了单独筛选,这意味着您可能会获得id等于ID1、ID2或ID3之一的数据。他需要或条件而不是和条件。我认为你在蜂巢里没有工作知识。Hive中有一些限制。我想我有足够的知识来真正了解这个查询的作用。即使配置单元中存在限制,通过此查询,您也可以获取至少在三列之一中未引用过一次的任何数据。所以它根据OP的要求提供了太多的数据。