16

我有一个查询,它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 

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

4 回答 4

30
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 列。

于 2009-06-17T01:55:05.607 回答
4

您应该使用 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
于 2009-06-17T03:09:25.643 回答
1

在我的脑海中,我会说最坏的情况是您创建一个临时表,其中所有字段都从 T1 和 T2 执行 INSERT INTO 临时表,然后从临时表中按顺序选择。

IE。创建一个临时表(例如#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% 确定插入的 null 语法,但我认为它会起作用。

编辑:在 id 之后按价格和缩写添加了排序...如果 Id 没有链接 T1 和 T2,那又是什么?

于 2009-06-16T22:55:13.627 回答
1

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

于 2009-06-16T22:52:33.213 回答