【问题标题】:How to merge order by records from two different queries in SQL Server如何按 SQL Server 中两个不同查询的记录合并顺序
【发布时间】:2017-12-13 05:56:28
【问题描述】:

以下场景,我需要同一张表中具有特定条件的前 3 条记录,并且需要与不包括第一个查询结果的第二个查询记录合并。

表 A:

    Id  Name Flag
    -------------
    1    A    1
    2    B    0
    3    C    0
    4    D    1
    5    E    0
    6    F    1
    7    G    0
    8    H    0

前 3 名,其中标志 = 1,最新记录页面索引为 1,行数为 5

   Id   Name Flag
  ----------------
    6    F    1
    4    D    1         first require flag  =1 first 3 records
    1    A    1
    ---------------------------------------
    8    H    0
    7    G    0

最新记录的页面索引 2 和行数 5

    Id  Name Flag
    --------------
    6    F    1
    5    E    0
    3    C    0
    2    B    0

如何通过 SQL 查询实现这一点?

IF (@PageNumber = 0)  
BEGIN  
    SELECT TOP (@RowsPerPage) [Id], [Name], [Flag] 
    FROM  
        (SELECT [Id], [Name], [Flag]  
         FROM 
             (SELECT TOP 3 [Id], [Name], [Flag]  
              FROM [A] 
              WHERE Flag = 1 
              ORDER BY Id DESC

              UNION             

              SELECT [Id], [Name], [Flag] 
              FROM [A] 
              ORDER BY Id DESC) T
    END
    ELSE
    BEGIN 
        // Normal paging query excluding top 3 flag records.
    END

【问题讨论】:

  • 我看到 id 6 出现在两个结果集中
  • 是的,是错字,不会出现
  • 请在下方查看我的答案

标签: sql sql-server sql-server-2008 sql-server-2016


【解决方案1】:

试试这个

WITH CTE
AS
(
    SELECT
        Seq1 = ROW_NUMBER() OVER(PARTITION BY Flag ORDER BY Id DESC),
        Seq2 = ROW_NUMBER() OVER(ORDER BY Id DESC),
        Id,
        Name,
        Flag
        FROM t1     
)
SELECT
Seq1,
id,
name,
flag
FROM CTE
  WHERE Seq1 < 4

 UNION ALL

 SELECT
Seq2,
id,
name,
flag
FROM CTE
  WHERE Seq1 >3
  ORDER BY 4 desc,1

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多