代码之家  ›  专栏  ›  技术社区  ›  NateJ Richard Berg

ORDER BY与不同数据集的联合(T-SQL)

  •  15
  • NateJ Richard Berg  · 技术社区  · 15 年前

    我有一个疑问 UNION 协会 .)

    ORDER 使用仅存在于一个或另一个集合中的列生成的数据,以便以友好的格式为软件端获取数据。

    例如: 表1 ID, Cat, Price . 表2 有田地 ID, Name, Abbrv . 这个 ID 字段是两个表之间的公共字段。


    我的查询如下所示:

    SELECT t1.ID, t1.Cat, t1.Price, NULL as Name, NULL as Abbrv FROM t1 
    UNION 
    SELECT t2.ID, NULL as Cat, NULL as Price, t2.Name, t2.Abbrv FROM t2 
    ORDER BY Price DESC, Abbrv ASC 
    

    这个 ORDER BY

    100   Balls     1.53                       
    200   Bubbles   1.24                       
    100                     RedBall    101RB   
    100                     BlueBall   102BB   
    200                     RedWand    201RW   
    200                     BlueWand   202BW   
    

    …但我希望它看起来像这样:

    100   Balls     1.53                       
    100                     RedBall    101RB   
    100                     BlueBall   102BB   
    200   Bubbles   1.24                       
    200                     RedWand    201RW   
    200                     BlueWand   202BW   
    

    我希望这可以在T-SQL中实现。

    4 回复  |  直到 6 年前
        1
  •  29
  •   Jose Basilio    15 年前
    Select ID, Cat, Price, Name, Abbrv
    From
    (SELECT t1.ID, t1.Cat, t1.Price, t1.Price AS SortPrice, NULL as Name, NULL as Abbrv 
    FROM t1
    UNION
    SELECT t2.ID, NULL as Cat, NULL as Price, t1.Price as SortPrice, t2.Name, t2.Abbrv 
       FROM t2
       inner join t1 on t2.id = t1.id
    ) t3
    ORDER BY SortPrice DESC, Abbrv ASC
    

    不知何故,您必须知道表2中的数据与表1相关联,并共享价格。由于abbrv中的Null将首先出现,因此无需创建SortAbbrv列。

        2
  •  4
  •   Amy B    15 年前

    您应该使用UNION ALL而不是UNION来节省重复检查的成本。

    SELECT *
    FROM
    (
    SELECT t1.ID, t1.Cat, t1.Price, NULL as Name, NULL as Abbrv FROM t1
    UNION ALL
    SELECT t2.ID, NULL as Cat, NULL as Price, t2.Name, t2.Abbrv FROM t2
    ) as sub
    ORDER BY
      ID,
      CASE WHEN Price is not null THEN 1 ELSE 2 END,
      Price DESC,
      CASE WHEN Abbrv is not null THEN 1 ELSE 2 END,
      Abbrv ASC
    
        3
  •  1
  •   Avitus    15 年前

    一个快速的解决方案是在临时表或表变量中插入2次,作为插入临时表的一部分,您可以设置一个标志列来帮助排序,然后按该标志列排序。

        4
  •  1
  •   mundeep    15 年前

    在我的脑海中,我会说最坏的情况是创建一个临时表,所有字段都从T1&插入临时表;T2然后从临时表中选择order by。

    即,创建一个临时表(例如#temp),其中包含Id、Cat、Price、Name、Abbrv等字段,然后:

    SELECT Id, Cat, Price, null, null INTO #temp FROM T1
    SELECT Id, null, null, Name, Abbrv INTO #temp FROM T2
    SELECT * FROM #temp ORDER BY Id, Price DESC, Abbrv ASC
    

    注意:我不是100%确定插入的空语法,但我认为它会起作用。

    编辑:按价格和价格添加订单;在id之后的缩写。。。如果Id未链接T1&T2那是什么呢?