zoukankan      html  css  js  c++  java
  • Hive学习之Union和子查询

    Union的语法格式如下:

    select_statement UNION ALL select_statement UNION ALL select_statement ... 

    Union用于将多个SELECT语句的查询结果合并到一个结果集中,目前Hive只支持UNION ALL,也就是结果集中的重复记录不会被删除。SELECT语句返回列的数目和名称必须相同,否则会报schema错误。Union语句还可以嵌套在FROM子句中:

    SELECT *  
    FROM (  
      select_statement  
      UNION ALL  
      select_statement  
    ) unionResult  

        在Hive-0.12.0及之前的版本中,Union只能在子查询中使用,在Hive-0.13.0版本中,去除了该限制,Union查询可以作为独立的查询使用

        看过了Union后,现在来看看子查询。在Hive-0.12.0及之前的版本中子查询只能出现在FROM子句中,且必须给定一个名称,因为每个在FROM子句中的表必须拥有名称。子查询中的列必须有唯一的名称,子查询中的列在外部查询中可以像表中的列那样使用,子查询也可以是Union查询,Hive支持任意层的子查询。具体语法如下:

    SELECT ... FROM (subquery) name ...  
    SELECT ... FROM (subquery) AS name ... //AS关键字是在Hive-0.13.0中引入的  

    下面是包含Union all子查询的例子:

    SELECT t3.col  
    FROM (  
      SELECT a+b AS col  
      FROM t1  
      UNION ALL  
      SELECT c+d AS col  
      FROM t2  
    ) t3 

    从Hive-0.13.0开始,某些类型的子查询可以出现在WHERE子句中,这些子查询的结果可以被IN、NOT IN、EXISTS和NOT EXISTS语句当做常量,也称为不相关查询,因为子查询不引用父查询的列。下面是两个例子:

    SELECT *  
    FROM A  
    WHERE A.a IN (SELECT foo FROM B);   
      
    SELECT A  
    FROM T1  
    WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y)  

     子查询的一些限制总结如下:

    • 子查询只能出现在表达式的右侧
    • IN/NOT IN的子查询中只允许选择一列
    • EXISTS/NOT EXISTS必须有一个或者多个相关谓词
    •  对父查询的引用只能出现在子查询的WHERE子句中

    转自:http://blog.csdn.net/skywalker_only/article/details/39294183

  • 相关阅读:
    【POJ 1958】 Strange Towers of Hanoi
    【HNOI 2003】 激光炸弹
    【POJ 3263】 Tallest Cow
    【POJ 2689】 Prime Distance
    【POJ 2777】 Count Color
    【POJ 1995】 Raising Modulo Numbers
    【POJ 1845】 Sumdiv
    6月16日省中集训题解
    【TJOI 2018】数学计算
    【POJ 1275】 Cashier Employment
  • 原文地址:https://www.cnblogs.com/sunfie/p/7517283.html
Copyright © 2011-2022 走看看