由于列别名导致oracle中的标识符无效错误

时间:2014-03-17 16:01:24

标签: sql oracle

我的查询如下

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无效标识符'错误。

我尝试过不同的变体来定义我在下面给出的别名以及我使用它时得到的错误

  1. 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
    
  2. 错误:col3无效标识符

    1. 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
      
    2. 错误:在

      之后缺少表达式
      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
        
      2. 错误:在

        之后缺少表达式

        请解释我的错误

        P.S。我不知道为什么我无法在此处将查询示例标记为代码。我为这些查询的可读性差而道歉

2 个答案:

答案 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.