2012-11-22 26 views
8

SQL腳本,它已經在生產服務器長時間沒問題, 但最近如果語句包含UNION運算符,那麼是否必須在選擇列表中顯示ORDER BY項目?

令人奇怪的是系統報告「如果 語句包含UNION運算符,ORDER BY項目必須出現在選擇列表」運行SQL腳本仍然可以在我的測試服務器上運行。所以我不知道我做的任何修訂版本是否可以在生產中正確運行。

SELECT '' as value ,'Outstanding' as text , 0 as disp_order 
union 
select a.buyer_status_code AS value , a.buyer_status_name AS text ,a.disp_order 
FROM rfq_buyer_status_v a WITH (NOLOCK) 
ORDER BY a.disp_order 

回答

15

試試這個:

select * from 
(
SELECT '' as value ,'Outstanding' as text , 0 as disp_order 
union 
select a.buyer_status_code AS value , a.buyer_status_name AS text ,a.disp_order 
FROM rfq_buyer_status_v a WITH (NOLOCK) 
) t 

ORDER BY t.disp_order 
14

SQL Server中的階段順序如下分析查詢:

FROM - > WHERE - > GROUP BY - > HAVING - >選擇 - > ORDER BY

每個階段在一個或多個表上作爲輸入,並返回一個虛擬表作爲輸出。 一個階段的輸出表被視爲下一個階段的輸入。這與產生關係的關係操作一致。如果指定了ORDER BY,則結果 不是關係。

在早期階段中定義的任何別名都可以通過後面的階段進行查看,但反之亦然。

例如

下面的查詢是好的

SELECT [Col_1], [Col_2] 
FROM Table_A AS A 
WHERE A.[Col_1] > 0 
ORDER BY A.[Col_2]; 

,而這個人是行不通的

SELECT [Col_1] AS C1, [Col_2] AS C2 
FROM Table_A 
WHERE C1 > 0 
ORDER BY C2; 

現在, UNION集合運算符結合兩個輸入查詢的結果。作爲集合運算符,UNION具有隱含的DISTINCT屬性,這意味着它不返回重複的行。

如果您在查詢中使用了UNION,它將兩個集合合併爲一個,而ORDER BY將在組合集上生效,而不僅僅在SELECT ... FROM ...數據集上生效。 原因是ORDER BY是隊列中最弱的(或最後一個),它'捕獲所有'

在查詢的第一行中,您給0賦予了一個名爲'disp_order'的別名,這很好。在UNION運算符之後,您從包含名爲'disp_order'的列的表'rfq_buyer_status_v'查詢了一個數據集,這也是可以接受的。問題來自ORDER BY之後。

由於您還給出了表的別名,即'a',因此ORDER BY a.disp_order表示限制組合數據集部分的排序操作,該操作與'全部捕獲'活動衝突。

解決方案將刪除'a'。在ORDER BY子句之後。你可以這樣做的原因是你給了別名'disp_order'0,它與表rfq_buyer_status_v中的列名相同。那麼在這種情況下,我看不到任何鋸齒表的價值...

SELECT '' AS value ,'Outstanding' AS text , 0 AS disp_order 
UNION 
SELECT a.buyer_status_code AS value , a.buyer_status_name AS text ,a.disp_order 
FROM rfq_buyer_status_v a WITH (NOLOCK) 
ORDER BY disp_order 

編寫查詢的另一種方法是

SELECT ''   AS value , 
     'Outstanding' AS text , 
     0    AS ABC 
UNION 
SELECT buyer_status_code AS value , 
     buyer_status_name AS text , 
     disp_order  AS ABC 
FROM rfq_buyer_status_v 
    WITH (NOLOCK) 
ORDER BY ABC 

第二個給了disp_order列一個完全不同的別名,並使其易於閱讀和減少審查代碼時感到困惑的機會。

相關問題