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

Nat*_*teJ 15 sql t-sql sql-server union join

我有一个查询是UNION两个有点相似的数据集,但它们都有一些列不存在于另一个中(即,列中的结果中有NULL值UNION).

问题是,我需要ORDER使用仅存在于一个或另一个集合中的那些列来生成数据,以便以软件方面的友好格式获取数据.

例如:Table1有字段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 
Run Code Online (Sandbox Code Playgroud)

ORDER BY就是我被困住的地方.数据如下所示:

100   Balls     1.53                       
200   Bubbles   1.24                       
100                     RedBall    101RB   
100                     BlueBall   102BB   
200                     RedWand    201RW   
200                     BlueWand   202BW   
Run Code Online (Sandbox Code Playgroud)

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

100   Balls     1.53                       
100                     RedBall    101RB   
100                     BlueBall   102BB   
200   Bubbles   1.24                       
200                     RedWand    201RW   
200                     BlueWand   202BW   
Run Code Online (Sandbox Code Playgroud)

我希望这可以在T-SQL中完成.

Jef*_*ffO 28

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
Run Code Online (Sandbox Code Playgroud)

不知何故,你必须知道表2中的数据链接到表1并共享价格.由于abbrv中的Null将首先出现,因此无需创建SortAbbrv列.

  • 除非子查询具有别名,否则运行此查询会产生语法错误.我为你做了修正.+1 (4认同)

Amy*_*y B 5

您应该使用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
Run Code Online (Sandbox Code Playgroud)