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

影响结果集的SQL CTE和ORDER

  •  6
  • Brett  · 技术社区  · 16 年前

    我在下面粘贴了一个非常简单的SQL查询版本。我遇到的问题是 ORDER BY 语句正在影响我的CTE的选择结果。我不明白这是为什么,我最初的想法是在CTE中,我执行一些 SELECT 订货人 应该对这些结果起作用。

    不幸的是,我看到的行为是 选择 语句受订单的影响,给我不在 TOP 10

    下面是一个数据示例:

    ID,   Date
    9600  2010-10-12
    9599  2010-09-08
    9598  2010-08-31
    9597  2010-08-31
    9596  2010-08-30
    9595  2010-08-11
    9594  2010-08-06
    9593  2010-08-05
    9592  2010-08-02
    ....
    9573  2010-08-10
    ....
    8174  2010-08-05
    ....
    38    2029-12-20
    

    我的基本查询:

    ;with results as(
    select TOP 10 ID, Date
    from dbo.items
    )
    SELECT ID
    FROM results
    

    ID,   Date
    9600  2010-10-12
    9599  2010-09-08
    9598  2010-08-31
    9597  2010-08-31
    9596  2010-08-30
    9595  2010-08-11
    9594  2010-08-06
    9593  2010-08-05
    9592  2010-08-02
    

    我的问题是 订货人

    ;with results as(
    select TOP 10 ID, Date
    from dbo.items
    )
    SELECT ID
    FROM results
    ORDER BY Date DESC
    

    查询返回:

    ID,   Date
    38    2029-12-20
    9600  2010-10-12
    9599  2010-09-08
    9598  2010-08-31
    9597  2010-08-31
    9596  2010-08-30
    9595  2010-08-11
    9573  2010-08-10
    9594  2010-08-06
    8174  2010-08-05
    

    2 回复  |  直到 16 年前
        1
  •  14
  •   Mark Byers    16 年前

    当你使用 SELECT TOP n 你 如果您想要确定的行为,请提供订单,否则服务器可以自由返回 . 你所看到的行为是完全正确的。

    要解决此问题,请在CTE内指定订单:

    WITH results AS
    (
        SELECT TOP 10 ID, Date
        FROM dbo.items
        ORDER BY ID DESC 
    )
    SELECT ID
    FROM results
    ORDER BY Date
    
        2
  •  4
  •   Caleb    13 年前

    SELECT ROW_NUMBER() OVER(ORDER BY <ColumnName>;) AS RowNo
    

    然后你所有的专栏。。这将帮助您使用CTE锚查询。。。使用中间、where等子句。。

    推荐文章