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]只是子查询的别名。