ORDER BY in VIEW returns different results SQL

巧了我就是萌 提交于 2019-12-23 14:01:30

问题


This is my viww:

CREATE VIEW [STD_USER].[view_TransInvoice]
AS

SELECT TOP 999999 Customernr, Referensnr,'2' as a, InvoiceRowData, FileHead
    FROM [STD_USER].[Transexport]
    WHERE InvoiceRowData IS NOT NULL
    UNION 
SELECT TOP 999999 Customernr, Referensnr,'1' AS a , InvoiceHead , FileHead
    FROM [STD_USER].[Transexport]
    WHERE InvoiceHead IS NOT NULL
    UNION 
SELECT TOP 999999 Customernr, Referensnr,'3' AS a , InvoiceFoot , FileHead 
    from [STD_USER].[Transexport]
    WHERE InvoiceFoot IS NOT NULL
    ORDER BY Customernr, Referensnr, 3

When I run it on the server (Microsoft SQL Server Standard Edition v. 8.00.2055) x64 I get the result that I want in the right order.

But when I run it on (Microsoft SQL Server Standard Edition v.10.50.1702.0) x86 I do not get the same result. It’s likes it ignores the ORDER BY statement when I run the VIEW. If I just run the SELECT statements I do on the other hand get the RIGHT result with the right order. The databases are exactly the same and the scripts as well on both the servers.

Please help me!


回答1:


If you need an ORDER BY for the results you need to put an ORDER BY in the SELECT from the view.

The ORDER BY inside the View only serves to control what the TOP applies to for the [STD_USER].[Transexport] branch not for the eventual order of results in select operations against the view.

See TOP 100 Percent ORDER BY Considered Harmful. for more explanation of this.

Edit It is quite interesting though that the role of the final ORDER BY changes depending upon whether it is in a View or not. When the SELECT is run outside of a View it serves to order the entire results and it's role in limiting the TOP for the final branch of the UNION disappears.

Edit 2 This odd behaviour is discussed in the comments of this recent Connect Item

CREATE TABLE A (C VARCHAR(100))
CREATE TABLE B (C VARCHAR(100))


SELECT TOP 1000 C 
FROM A
UNION ALL
SELECT TOP 1000 C
FROM B
ORDER BY C

GO

CREATE VIEW V
AS
SELECT TOP 1000 C 
FROM A
UNION ALL
SELECT TOP 1000 C
FROM B
ORDER BY C

GO

SELECT *
FROM V

GO

DROP TABLE A
DROP TABLE B
DROP VIEW V




回答2:


I don't believe you are supposed to set an ORDER BY in the VIEW for ordering the data. A view outputs a set of data, which can then be queried.

This should be done when querying the View.

SELECT *
FROM [view_TransInvoice]
ORDER BY Customernr, Referensnr, a



回答3:


Maybe you did not get the hotfix on one of the servers?

http://support.microsoft.com/kb/926292



来源:https://stackoverflow.com/questions/8271045/order-by-in-view-returns-different-results-sql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!