我的查询如下
select t.col1,
t.col2,
(select count(col1)
from tab
where col1 = t.col1
and col2 = t.col2
) as col3
from tab t
where col3 > 1
该查询提供了一个' col3无效标识符'错误。
我尝试过不同的变体来定义我在下面给出的别名以及我使用它时得到的错误
select t.col1,
t.col2,
(select count(col1)
from tab
where col1 = t.col1
and col2 = t.col2
) as "col3"
from tab t
where col3 > 1
错误:col3无效标识符
select t.col1,
t.col2,
(select count(col1)
from tab
where col1 = t.col1
and col2 = t.col2
) as 'col3'
from tab t
where [col3] > 1
错误:在
之后缺少表达式select t.col1,
t.col2,
(select count(col1)
from tab
where col1 = t.col1
and col2 = t.col2
) "col3"
from tab t
where [col3] > 1
错误:在
之后缺少表达式请解释我的错误
P.S。我不知道为什么我无法在此处将查询示例标记为代码。我为这些查询的可读性差而道歉
答案 0 :(得分:6)
您的主要问题是您无法在相同的“嵌套级别”访问列别名。为了能够使用别名,您需要将整个查询包装在派生表中:
select *
from (
select t.col1,
t.col2,
(select count(col1)
from tab
where col1 = t.col1
and col2 = t.col2
) as col3
from tab t
)
where col3 > 1
您的“编号”示例有两个原因无效:首先是出于上述原因,其次是因为使用双引号引用的标识符区分大小写。因此,"col3"
是与"Col3"
不同的列名。由于Oracle将不带引号的标识符折叠为大写(遵循SQL标准的要求)col3
等同于"COL3"
最后:[col3]
是SQL中的无效标识符,无论您是否将其用作列别名。必须使用双引号引用标识符。这些方括号在SQL
答案 1 :(得分:2)
您不能在WHERE
子句中使用列别名,只能在ORDER BY
子句中使用。你有两个选择。
一,您可以将整个查询包装在另一个选择中,然后过滤col3:
select * from (
select t.col1,
t.col2,
(select count(col1)
from tab
where col1 = t.col1
and col2 = t.col2
) as col3
from tab t)
where col3 > 1;
或者您可以在WHERE
子句中重复标量子查询:
select t.col1,
t.col2,
(select count(col1)
from tab
where col1 = t.col1
and col2 = t.col2
) as col3
from tab t
where (select count(col1)
from tab
where col1 = t.col1
and col2 = t.col2
) > 1;
我自己建议选项1.