VIEW中的ORDER BY返回不同的结果SQL

时间:2011-11-25 15:15:13

标签: sql view sql-server-2000 sql-order-by

这是我的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

当我在服务器上运行它(Microsoft SQL Server标准版v.8.00.2055)x64时,我得到了我想要的结果。

但是当我在(Microsoft SQL Server标准版v.10.50.1702.0)x86上运行它时,我得不到相同的结果。我喜欢在运行VIEW时忽略ORDER BY语句。如果我只是运行SELECT语句,另一方面我会以正确的顺序获得正确的结果。 两个服务器上的数据库完全相同,脚本也是如此。

请帮助我!

3 个答案:

答案 0 :(得分:9)

如果您需要ORDER BY的结果,则需要在视图中的ORDER BY中添加SELECT

视图中的ORDER BY仅用于控制TOP适用于[STD_USER].[Transexport]分支的内容,而不是针对视图的选择操作中的最终结果顺序。

有关详细说明,请参阅TOP 100 Percent ORDER BY Considered Harmful.

编辑虽然最终ORDER BY的作用会根据是否在View中而有所改变,但这很有意思。当SELECT在视图之外运行时,它用于对整个结果进行排序,并且它在限制TOP的最终分支UNION的作用中消失。

编辑2 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

Plan

答案 1 :(得分:1)

我不相信您应该在ORDER BY中设置VIEW来排序数据。视图输出一组数据,然后可以查询。

查询视图时应该这样做。

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

答案 2 :(得分:0)

也许你没有在其中一台服务器上获得此修补程序?

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