【问题标题】:Alternative logic for a subquery as part of a condition作为条件一部分的子查询的替代逻辑
【发布时间】:2016-01-05 15:44:36
【问题描述】:

我有两张桌子:

      T1

key  code1  code2  code3
  1      A      A      A
  2      B      B      G
  3      A      B      C
  4      C      C      C
  5      D      E      F
  6      E      E      E
  7      A      D      G
  8      G      G      G


      T2

code  class1  class2  class3 
   A       1       0       0      
   B       0       1       0      
   C       0       1       0      
   D       1       1       0      
   E       0       0       1      
   F       0       1       0      
   G       1       0       0      

我想写一个类似...的查询

create table T3 as
select key, case 
            when code1 in (select code from T2 where class1 = 1) or
                 code2 in (select code from T2 where class1 = 1) or
                 code3 in (select code from T2 where class1 = 1) 
                 then 1 else 0
            end as class1,
            case 
            when code1 in (select code from T2 where class2 = 1) or
                 code2 in (select code from T2 where class2 = 1) or
                 code3 in (select code from T2 where class2 = 1) 
                 then 1 else 0
            end as class2,
            case 
            when code1 in (select code from T2 where class3 = 1) or
                 code2 in (select code from T2 where class3 = 1) or
                 code3 in (select code from T2 where class3 = 1) 
                 then 1 else 0
            end as class3
from T1 

基本上就是说对于T1中的每一个key,看T2中对应的代码是不是每个class都有1。如果是,那么新列是 1。

问题是,我使用的 HiveQL 版本不支持像这样的条件语句中的子查询。是否有替代方法来实现相同的结果集?我正在考虑加入,但由于 T2 没有相应的密钥,我不确定在这种情况下最好的方法。

作为参考,结果集将是

      T3

key  class1  class2  class3
  1       1       0       0
  2       1       1       0
  3       1       1       0
  4       0       1       0
  5       1       1       1
  6       0       0       1
  7       1       1       0
  8       1       0       0

【问题讨论】:

    标签: sql hive subquery hiveql in-subquery


    【解决方案1】:

    这符合您的预期结果:

    SELECT
        [key],
        MAX(T2.class1) AS class1,
        MAX(T2.class2) AS class2,
        MAX(T2.class3) AS class3
    FROM
        dbo.T1
    LEFT OUTER JOIN dbo.T2 ON T2.code IN (T1.code1, T1.code2, T1.code3)
    GROUP BY
        [key]
    

    【讨论】:

    • 不幸的是,HIVE 0.12 不支持非相等条件的连接条件,这意味着这将不起作用。另一个答案也不起作用,因为它不支持 OR。我是否必须创建 3 个不同的表,然后将它们连接在一起? @TomH
    • 呸。多么严格的语言。听起来多重连接是唯一的可能性。
    【解决方案2】:
    SELECT `key`,
     MAX(CASE WHEN  class1 = 1 THEN 1 ELSE 0 END) as class1,
     MAX(CASE WHEN  class2 = 1 THEN 1 ELSE 0 END) as class2,
     MAX(CASE WHEN  class3 = 1 THEN 1 ELSE 0 END) as class3
    FROM t1 JOIN t2 ON t1.code1=t2.code 
    OR  t1.code2=t2.code 
    OR  t1.code3=t2.code 
    GROUP BY `key`
    

    假设mysql,key是保留字,需要反引号

    【讨论】:

    • 我不相信这会奏效,因为每个 ID 都会得到多个结果。
    • 也许每个案例的不同或最大值可以解决问题。
    • 是的,我猜这将提供比必要保留更多的行
    猜你喜欢
    • 2010-12-11
    • 2021-07-30
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多