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

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

这是我的 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 BYSELECT从观点来看。
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

Plan

关于sql - VIEW中的ORDER BY返回不同的结果SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8271045/

相关文章:

sql - 在具有来自另一个表的附加数据集的行中搜索重复项

sql - 使用参数创建 SQL View

mysql - #1025 - 将 './database/#sql-2e0f_1254ba7' 重命名为 './database/table' 时出错(错误号 : 150)

android - 在我的 Android Activity 中获取对 View 的引用

javascript - React Native 中 View 的反转边框半径

sql - 组织 SQL 批处理语句

sql-server - SQL Server,在多个数据库上执行批处理T-SQL脚本

c# - 销售点的逻辑?

java - JPA 和 TableView 。可以做到吗?

sql-server - 上次修改日期对象