代码之家  ›  专栏  ›  技术社区  ›  thursdaysgeek

SQL按顺序和左外连接的顺序不正确

  •  2
  • thursdaysgeek  · 技术社区  · 17 年前

    我有一种观点,即连接两张表并按第一张表排序。只是顺序不正确。它偶尔会漏掉一条记录,然后在最后,这些记录中的大多数都是按顺序存在的,然后在这一点上,其余的记录也是按顺序存在。因此,它有以下记录

    1  (most of the records in order)
    2
    4
    5
    6
    7
    8
    10
    11
    13
    15
    3  (the first set of missing records)
    12
    9 (the rest of the missing records)
    14
    

    我的观点如下。我需要在加入之前先完成订单吗?我做错了什么?(我已经获得了这个视图,在另一个db实例中,完全相同的视图可以正常工作。)

    CREATE VIEW [dbo].[SampleView]
    AS
    SELECT     TOP 100 PERCENT blp.*, ISNULL(YEAR(DATEADD(month, 2, tb.[End of D&D])), 0) AS DEMO_FY
    FROM         dbo.Table1 AS blp LEFT OUTER JOIN
                          dbo.Table2 AS tb ON blp.FACIL_NAME = tb.[Structure ID]
    ORDER BY blp.ID
    

    (编辑)排序字段的类型是[ID][int]NOT NULL IDENTITY(1,1),

    5 回复  |  直到 17 年前
        1
  •  2
  •   SQLMenace    17 年前

    阅读 Create a sorted view in SQL Server 2005 and SQL Server 2008 有一个修补程序,你必须在2000兼容模式下运行才能正常工作。为什么不在从视图中选择时按顺序执行呢?

        2
  •  2
  •   Joel Coehoorn    17 年前

    我将从视图中完全删除ORDER BY子句。相反,请在查询视图时指定您的订单。

        3
  •  2
  •   Community Mohan Dere    5 年前

    评论在 this 博客文章很清楚。

    再次引用BOL的文本:

    在视图、内联函数、派生表或子查询的定义中使用ORDER BY时,该子句仅用于确定TOP子句返回的行。ORDER BY子句不保证查询这些构造时的有序结果,除非在查询本身中也指定了ORDER BY

    “虽然视图定义包含ORDER BY子句,但该ORDER BY语句仅用于确定TOP子句返回的行。查询视图本身时,SQL Server不保证结果将按顺序排列,除非您明确指定,如以下查询所示:

    SELECT * FROM TopView
    ORDER BY LastName
    

    "

        4
  •  1
  •   Brent Ozar    17 年前

    最有可能的是,这两个SQL Server的版本略有不同。有一个已知的修补程序:

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

        5
  •  1
  •   mfx    17 年前

    您应该始终在最后一个可能的点“排序”,因为排序很慢(N log N)。在视图上执行选择时,通常会包含where子句。您只想对结果集进行排序。

    推荐文章