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 ...'声明给出了意想不到的结果[重