Sql server 按SQL Server 2017中的第一行、最后一行和其余两个表排序

Sql server 按SQL Server 2017中的第一行、最后一行和其余两个表排序,sql-server,Sql Server,我有以下两张桌子。我需要合并2个表的基础上也排序 几乎没有条件 DROP TABLE IF EXISTS #t1 CREATE TABLE #t1 ( id INT IDENTITY PRIMARY KEY, value INT ) DROP TABLE IF EXISTS #t2 CREATE TABLE #t2 ( id INT IDENTITY PRIMARY KEY, value int ) INSERT INTO #t1 (value) VAL

我有以下两张桌子。我需要合并2个表的基础上也排序 几乎没有条件

DROP TABLE IF EXISTS #t1

CREATE TABLE #t1
(
    id INT IDENTITY PRIMARY KEY,
    value INT
)

DROP TABLE IF EXISTS #t2

CREATE TABLE #t2
(
    id INT IDENTITY PRIMARY KEY,
    value int
)

INSERT INTO #t1 (value) 
VALUES (1), (30), (19), (10), (40);

INSERT INTO #t2 (value)  
VALUES (100), (70), (20);

SELECT * FROM #t1
UNION
SELECT * FROM #t2
我需要根据以下条件合并2个表和排序值

  • #t1
    第一行(固定)
  • #t1
    最后一行(固定)
  • #t1
    基于值的休息(第一行除外) 4
    #t2
    仅根据值排序
  • 预期产出:


    为什么要使用
    varchar
    存储数值?在排序之前,您需要执行一个
    cast()或convert()

    假设:通过
    第一个
    最后一个
    您指的是列
    id
    中具有
    最小值和
    最大值的行

    select  value, seq as [order]
    from
    (
        select  id, value, 
                seq = case when row_number() over(order by id) = 1 then 1 
                           when row_number() over(order by id desc) = 1 then 2
                           else 3
                           end
        from    #t1
    
        union all
    
        select  id, value, seq = 4
        from    #t2
    ) d
    order by seq, convert(int, value)
    

    为什么要使用
    varchar
    存储数值?在排序之前,您需要执行一个
    cast()或convert()

    假设:通过
    第一个
    最后一个
    您指的是列
    id
    中具有
    最小值和
    最大值的行

    select  value, seq as [order]
    from
    (
        select  id, value, 
                seq = case when row_number() over(order by id) = 1 then 1 
                           when row_number() over(order by id desc) = 1 then 2
                           else 3
                           end
        from    #t1
    
        union all
    
        select  id, value, seq = 4
        from    #t2
    ) d
    order by seq, convert(int, value)
    

    您可以使用ORDER子句中的CASE语句检查以下输出排序逻辑-

    SELECT *
    FROM
    (
        select 'T1' T_Name,* from #t1
        union
        select 'T2',* from #t2
    )A
    ORDER BY 
    CASE 
        WHEN t_name = 'T1' AND id = (SELECT MIN(ID) FROM #t1) THEN 1
        WHEN t_name = 'T2' AND id = (SELECT MAX(ID) FROM #t2) THEN 2
        WHEN t_name = 'T1' THEN 3
        ELSE 4
    END, 
    Id -- Or you can order by Value. Just keep in mind that Value is VARCHAR as per your setup. So, Ordering will be also impact accordingly.
    

    您可以使用ORDER子句中的CASE语句检查以下输出排序逻辑-

    SELECT *
    FROM
    (
        select 'T1' T_Name,* from #t1
        union
        select 'T2',* from #t2
    )A
    ORDER BY 
    CASE 
        WHEN t_name = 'T1' AND id = (SELECT MIN(ID) FROM #t1) THEN 1
        WHEN t_name = 'T2' AND id = (SELECT MAX(ID) FROM #t2) THEN 2
        WHEN t_name = 'T1' THEN 3
        ELSE 4
    END, 
    Id -- Or you can order by Value. Just keep in mind that Value is VARCHAR as per your setup. So, Ordering will be also impact accordingly.
    

    在第一个表中,“first”行不是1,“last”不是40,除非您还包括另一个保持该顺序的列。在第一个表中,“first”行不是1,“last”不是40,除非您还包括另一个保持该顺序的列。然后您可以删除
    CONVERT()
    ORDER BY
    条款中,您可以删除
    ORDER BY
    子句中的
    CONVERT()