【问题标题】:Select from subselect从子选择中选择
【发布时间】:2015-12-21 19:22:05
【问题描述】:

所以我有以下导致错误的示例查询(对于那些对其感兴趣的人:ORA-00904:“BLEH”:无效标识符)

select bleh from (
            SELECT MIN(mtb.id) KEEP (DENSE_RANK FIRST ORDER BY mtb.id) "bleh"
              FROM mytable mtb
             WHERE mtb.filtered_field_one = 0
               and mtb.filtered_field_two = 0
          GROUP BY mtb.foreighn_id, mtb.id
);

如果我把它改成(注意我用*替换了bleh):

select * from (
            SELECT MIN(mtb.id) KEEP (DENSE_RANK FIRST ORDER BY mtb.id) "bleh"
              FROM mytable mtb
             WHERE mtb.filtered_field_one = 0
               and mtb.filtered_field_two = 0
          GROUP BY mtb.foreighn_id, mtb.id
);

我收到的结果与我对第一个查询的预期完全一样,它看起来像 1 个名为 bleh 的列,具有正确的值。

那么为什么我不能按该列的名称(别名)选择?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    当您使用" 双引号命名列时,数据库需要您按原样调用它,也需要使用双引号!所以试试这个方法:

    select "bleh" from (
            SELECT MIN(mtb.id) KEEP (DENSE_RANK FIRST ORDER BY mtb.id) "bleh"
              FROM mytable mtb
             WHERE mtb.filtered_field_one = 0
               and mtb.filtered_field_two = 0
          GROUP BY mtb.foreighn_id, mtb.id
    ); 
    

    或者这样:

    select bleh from (
            SELECT MIN(mtb.id) KEEP (DENSE_RANK FIRST ORDER BY mtb.id) bleh
              FROM mytable mtb
             WHERE mtb.filtered_field_one = 0
               and mtb.filtered_field_two = 0
          GROUP BY mtb.foreighn_id, mtb.id
    ); 
    

    即使我说as is 我认为@Stawros 提供的评论是一种宝贵的信息和平:

    关于oracle中的列命名:

    bleh = BLEH = Bleh
    but 
    "bleh" <> "BLEH" <> "Bleh"
    

    【讨论】:

    • bleh = BLEH = Bleh,但是"bleh" "BLEH" "Bleh"
    • @Stawros 你是绝对正确的!这就是为什么我说as is :)
    • @JorgeCampos 我真的知道...该死...好吧,谢谢 :)
    • 很高兴它可以提供一些帮助:)
    猜你喜欢
    • 2019-04-04
    • 2016-12-12
    • 2018-09-01
    • 1970-01-01
    • 2012-09-12
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多