【问题标题】:select a columns not exist in another tables multiple columns in sql选择另一个表中不存在的列sql中的多个列
【发布时间】:2018-11-16 04:36:27
【问题描述】:

我有两个表 Tables1,分别是 ID、name,而 Table2 有 ID1、ID2 和 ID3、name1、name2 和 name3。 我要选择table1.ID在tables2中不存在: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  )

我收到此查询的错误消息

【问题讨论】:

    标签: hive subquery conditional-statements not-exists


    【解决方案1】:

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


    根据我对您的问题的理解,您希望选择其中的结果将是 Table2 中不存在的元素。

    为此,您只需使用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
    

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

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

    【讨论】:

    • 我要选择table1.ID 不存在于tables2 中:ID1、ID2 和ID3 列。 select t1.ID, ti.name from table1 t1 where t1.ID not in (select t2.ID1, t2.ID2,t2.ID3 from table2 t2) 它不工作。错误消息:子查询在选择列表中只能包含一项
    • 然后您可以使用ORAND 向内部联接添加多个条件
    • 您好 Sirmyself,ON 不支持(T2.ID1 = T1.ID OR T2.ID2 = T1.ID)
    • 我检查了,查询与两个 LEFT JOIN 一起工作,我将编辑我的答案
    • 嗨 Simyself ,左加入一个很好,你能编辑你的答案,我会接受作为答案-谢谢
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

      • 很可能您从该查询中得到重复,并且您单独过滤 3 列,这意味着您可能会获得 id 等于 ID1ID2ID3 之一的数据.
      • 他需要 OR 条件而不是 AND 条件。我认为您在 Hive 中没有工作知识。 Hive 中存在限制。
      • 我想我有足够的知识来真正知道这个查询的作用。即使 hive 存在限制,使用此查询,您也可以在三列之一中获取至少未引用一次的任何数据。因此,根据 OP 的要求,它为您提供了太多数据。
      猜你喜欢
      • 1970-01-01
      • 2017-11-13
      • 2018-06-18
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2016-06-21
      相关资源
      最近更新 更多