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

2019-07-28 20:43发布

我有一个查询, UNION的两位有点类似的数据集,但它们都有一些列不存在于其他(即列在所产生的NULL值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来完成。

Answer 1:

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的空会首先,有没有必要创建一个SortAbbrv列。



Answer 2:

您应该使用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


Answer 3:

一个快速的解决办法是做2插入到一个临时表或表变量和插件的一部分到临时表中,可以设置标志列,以帮助由标志列排序,然后顺序。



Answer 4:

关闭我的头顶,我会说,最糟糕的情况是,你创建一个临时表中的所有字段做一个INSERT INTO从两个T1&T2临时表,然后从临时表中选择与订单。

即。 与字段创建临时表(如#TEMP)标识,猫,价钱,名称,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%确定从插入空语法,但我认为它会工作。

编辑:添加排序由价格和Abbrv ID后...如果ID不链接T1&T2产生又是什么呢?



文章来源: ORDER BY with a UNION of disparate datasets (T-SQL)