这是我的 View :
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 语句,另一方面我会以正确的顺序获得正确的结果。
两台服务器上的数据库和脚本完全相同。
请帮我!
最佳答案
如果您需要 ORDER BY
对于结果,您需要输入 ORDER BY
在 SELECT
从观点来看。ORDER BY
View 内部仅用于控制 TOP
适用于[STD_USER].[Transexport]
分支不是为了在针对 View 的选择操作中的最终结果顺序。
见 TOP 100 Percent ORDER BY Considered Harmful.对此的更多解释。
编辑 虽然最后ORDER BY
的角色很有趣。变化取决于它是否在 View
或不。当SELECT
在 View 之外运行它用于对整个结果进行排序,并且它在限制 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
关于sql - VIEW中的ORDER BY返回不同的结果SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271045/