Sql 在“中使用新列”;其中;条款

Sql 在“中使用新列”;其中;条款,sql,hive,Sql,Hive,hive拒绝此代码: select a, b, a+b as c from t where c > 0 正在说无效的表别名或列引用“c” 我真的需要写这样的东西吗 select * from (select a, b, a+b as c from t) where c > 0 编辑: c的计算非常复杂,我不想在中重复它,其中a+b>0 我需要一个在hive中工作的解决方案 你很接近,你能做到 select a, b, a+b as c from t where a+b >

hive
拒绝此代码:

select a, b, a+b as c
from t
where c > 0
正在说
无效的表别名或列引用“c”

我真的需要写这样的东西吗

select * from 
(select a, b, a+b as c
 from t)
where c > 0
编辑:

  • c
    的计算非常复杂,我不想在
    中重复它,其中a+b>0
  • 我需要一个在
    hive中工作的解决方案

  • 你很接近,你能做到

    select a, b, a+b as c
    from t
    where a+b > 0
    
    没有

    只是:

    选择a、b、a+b作为c 从t 其中a+b>0

    注意:对于mysql至少:order by和group by可以使用列(或表达式)位置

    e、 g.GROUPBY 2,ORDERBY 1将为每列2(无论是字段名还是表达式)获取一行,并按列1(字段或表达式)对其进行排序


    另外:有些RDBMS允许您在第一次尝试时引用列别名,如果您想使用派生列,请使用公共表表达式

    with x as
    (
    select a, b, a+b as c
    from t
    )
    select * from x where c >0
    

    它必须是这样的:

    select a, b, a+b as c
    from t
    where a+b > 0
    
    解释/记住这一点的一个简单方法是:SQL不能引用在其自身实例中指定的别名。但是,如果您这样做,它将起作用:

    SELECT a,b,c
    FROM(
    select a, b, a+b as c
    from t) as [calc]
    WHERE c > 0
    

    此语法将起作用,因为别名是在子查询中分配的。

    您可以像这样运行此查询或使用公共表表达式运行此查询

    select a, b, a+b as c
    from t
    where a+b > 0
    
    参考以下逻辑查询处理的操作顺序,了解是否可以在另一个子句中使用派生列

    按顺序排列

  • 挑选
  • 在哪里
  • 分组
  • 拥有
  • 订购人
  • 逻辑查询处理阶段

  • 在哪里
  • 分组
  • 拥有
  • 挑选
  • 订购人

  • 这将调用
    select
    两次-这与我自己的解决方案有何不同?它是一个CTE,而不是派生表。但对您的问题的简短回答是,您不能在WHERE子句中引用派生列-这只是比派生表可读一点而已。什么是
    [calc]
    ?这与我的解决方案有何不同?[calc]只是子查询的别名。