【问题标题】:ORDER BY upper(...) with a UNION giving me problemsORDER BY upper(...) 与 UNION 给我带来问题
【发布时间】:2014-08-03 05:47:48
【问题描述】:

我很难弄清楚为什么会出现这个问题。

这段代码完全按照它应该的方式工作。它结合了两个表(MESSAGES 和 MESSAGES_ARCHIVE)并正确排序。

SELECT * FROM ( 
    SELECT rownum as rn, a.* FROM ( 
        SELECT  
        outbound.FROM_ADDR, outbound.TO_ADDR, outbound.EMAIL_SUBJECT

        from MESSAGES outbound 
        where (1 = 1) 

        UNION ALL

        SELECT  
        outboundarch.FROM_ADDR, outboundarch.TO_ADDR, outboundarch.EMAIL_SUBJECT

        from MESSAGES_ARCHIVE outboundarch 
        where (1 = 1)  

        order by FROM_ADDR DESC 
    ) a 
) where rn between 1 and 25

但是,此代码不起作用。

SELECT * FROM ( 
    SELECT rownum as rn, a.* FROM ( 
        SELECT  
        outbound.FROM_ADDR, outbound.TO_ADDR, outbound.EMAIL_SUBJECT

        from MESSAGES outbound 
        where (1 = 1) 

        UNION ALL

        SELECT  
        outboundarch.FROM_ADDR, outboundarch.TO_ADDR, outboundarch.EMAIL_SUBJECT

        from MESSAGES_ARCHIVE outboundarch 
        where (1 = 1)  

        order by upper(FROM_ADDR) DESC 
    ) a 
) where rn between 1 and 25

并返回此错误

ORA-01785: ORDER BY item must be the number of a SELECT-list expression
01785. 00000 -  "ORDER BY item must be the number of a SELECT-list expression"

我试图让这两个表排序,无论字母大小写如何,这就是我使用upper(FROM_ADDR) 的原因。有什么建议?谢谢!

【问题讨论】:

  • 使用 UNIONS(ALL) 和 DISTINCT 时,ORDER by 应使用精确选择的表达式指定或提及为 1,2.. 作为列位置。一般来说,我会相信,按不在 SELECT 中的东西排序,oracle 隐含地包含在 select 中并对其进行排序。在这种情况下,oracle 可以 not 隐含地添加 UPPER() 只是 bevauce,它必须进行 SET 操作。

标签: sql oracle sql-order-by oracle-sqldeveloper union-all


【解决方案1】:

您的 upper() 返回一个值,但不是列名。 而不是:

order by upper(FROM_ADDR) DESC

尝试:

order by upper(FROM_ADDR) as FROM_ADDR DESC

【讨论】:

    【解决方案2】:

    我不太清楚为什么会产生错误,但它可能与union 查询的范围规则有关。有一个简单的解决方法,使用row_number()

    SELECT * FROM ( 
        SELECT row_number() over (order by upper(FROM_ADDR)) as rn, a.*
        FROM ( 
            SELECT  
            outbound.FROM_ADDR, outbound.TO_ADDR, outbound.EMAIL_SUBJECT
    
            from MESSAGES outbound 
            where (1 = 1) 
    
            UNION ALL
    
            SELECT  
            outboundarch.FROM_ADDR, outboundarch.TO_ADDR, outboundarch.EMAIL_SUBJECT
    
            from MESSAGES_ARCHIVE outboundarch 
            where (1 = 1)  
    
        ) a 
    )
    where rn between 1 and 25
    

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多