美文网首页
UNION ALL、UNION与ORDER BY

UNION ALL、UNION与ORDER BY

作者: renyjenny | 来源:发表于2018-07-17 10:18 被阅读0次

    一直以为UNION和UNION ALL就是把每个子查询的结果集合并起来,只是UNION要去掉重复项。直到今天发现了一个问题,UNION的子句中不能出现ORDER BY。

    SELECT CUST_NUM FROM CUST_MST WHERE GENDR = 2 ORDER BY FLNM_NM
    UNION
    SELECT CUST_NUM FROM CUST_MST WHERE GENDR = 1 
    -- output 
    ORA-00933: SQLコマンドが正しく終了されていません。
    00933. 00000 -  "SQL command not properly ended"
    *Cause:    
    *Action:
    行15 列1でエラー
    

    解决方法是,要把有ORDER BY的子句作为子查询的子句。

    SELECT CUST_NUM FROM ( SELECT CUST_NUM FROM CUST_MST WHERE GENDR = 2 ORDER BY FLNM_NM)
    UNION
    SELECT CUST_NUM FROM CUST_MST WHERE GENDR = 1 
    

    不过呢,就算解决这个问题,子查询的排序和UNION后的结果集排序也没有联系。因为UNION会对两个结果集进行并集操作,去除重复行,按照默认规则的排序。所以UNION只能在整个语句的最后使用ORDER BY才能达到想要的效果。
    使用UNION ALL可以保持子结果集原本的顺序,按照子查询的先后顺序合并,靠前的子查询的结果集就排在前面。

    SELECT
        *
    FROM
        (
            SELECT CUST_NUM FROM CUST_MST WHERE GENDR = 2 ORDER BY FLNM_NM
        )
    UNION ALL
    SELECT
        *
    FROM
        (
            SELECT CUST_NUM FROM CUST_MST WHERE GENDR = 1 ORDER BY BIRTYM
        )
    
    UNION ALL

    至于为什么不能在子句中加ORDER BY,我也不知道……

    相关文章

      网友评论

          本文标题:UNION ALL、UNION与ORDER BY

          本文链接:https://www.haomeiwen.com/subject/awzfpftx.html