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

Posted

技术标签:

【中文标题】VIEW中的ORDER BY返回不同的结果SQL【英文标题】:ORDER BY in VIEW returns different results SQL 【发布时间】:2011-11-25 15:15:13 【问题描述】:

这是我的观点:

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 Standard Edition v. 8.00.2055) x64 上运行它时,我会以正确的顺序得到我想要的结果。

但是当我在 (Microsoft SQL Server Standard Edition v.10.50.1702.0) x86 上运行它时,我没有得到相同的结果。就像我在运行 VIEW 时忽略 ORDER BY 语句一样。另一方面,如果我只运行 SELECT 语句,我会以正确的顺序获得正确的结果。 数据库完全相同,两台服务器上的脚本也完全相同。

请帮帮我!

【问题讨论】:

UNION 的前 2 个分支将返回不确定的结果。你也需要一个ORDER BY 来表示TOP 999999 按什么排序(除非你的行数少于那个数,并且它只是用来尝试创建 SQL Server 2000 有序视图?) 【参考方案1】:

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

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

请参阅TOP 100 Percent ORDER BY Considered Harmful. 了解更多说明。

编辑 有趣的是,最终ORDER BY 的角色会根据它是否在View 中而有所不同。当SELECT 在视图之外运行时,它用于对整个结果进行排序,并且它在限制TOP 的最后一个分支UNION 中的作用消失了。

编辑 2this recent Connect Item 的 cmets 中讨论了这种奇怪的行为

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】:

我认为您不应该在VIEW 中设置ORDER BY 来订购数据。视图输出一组数据,然后可以对其进行查询。

这应该在查询视图时完成。

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

【讨论】:

当(且仅当)相关的SELECT 子句中有TOP 时,您可以在视图中拥有ORDER BY【参考方案3】:

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

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

【讨论】:

以上是关于VIEW中的ORDER BY返回不同的结果SQL的主要内容,如果未能解决你的问题,请参考以下文章

sql'select top 1' without 'order by' from view with 'top 100 percent ... order by ...'声明给出了意想不到的结果[重

SQL-W3School:SQL ORDER BY 子句

SQL ORDER 结果 BY 多个子句

oracle SQL语句中结合order by子句使用rownum

DB2 order by子句在不同的OS上给出了不同的结果

sql语句中的group by要怎么用!!