2012-12-19 47 views
1

我使用下面的查询:选择联盟SQL

select 8 Union Select 0 Union Select 15 

填充一列中的这3个号。我得到的结果是:

0 
8 
15 

但我希望8来先,然后0然后15,例如,

8 
0 
15 

我该怎么做?

+0

为什么要按特定顺序排列这些?其余的SQL在查询它们被放置的表时不会考虑它们的排序。哎呀,我甚至不会依赖插入顺序和一个自动生成的键来完全符合您的期望(因为如果系统可以使插入并行,你可以任意排列窗口)。如果你绝对需要它们,你可能更愿意添加一个“排序”列。 –

回答

3

使用UNION ALL E.g.

select 8 UNION ALL Select 0 UNION ALL Select 15 
+0

感谢您的快速响应。你的建议解决了。 – Kumar

+0

高兴得到了帮助。如果我已经回答了你的问题,你能否将其标记为答案 - 应该有个勾号来表明这一点。这将帮助任何发现你的问题的人知道哪些答案可以解决问题。 –

2

@ SimonMartin的答案适用于精确的数据集,你给,但是要注意,如果您的数据集包含重复的值,该UNION ALL会产生不同的结果比UNION

UNION运算符删除重复项,而UNION ALL将保留它们(以及它们的顺序,如@ SimonMartin的答案中所述)。

如果你要的功能与UNION ALL提供的排序功能,结合你UNION运营商,那么你就需要开始UNION ALL然后过滤掉重复的值自己:

-- baseline query + 1 duplicate record at the end 
with query as 
(
    select 8 as Val 
     UNION ALL 
    Select 0 as Val 
     UNION ALL 
    Select 15 as Val 
     UNION ALL 
    Select 0 as Val 
) 
-- now add row numbers 
, queryWithRowNumbers as 
(
    select row_number() over (order by (select 0)) as rn, Val 
    from query 
) 
-- finally, get rid of the duplicates 
select Val from (
    select Val, min(rn) as minRn 
    from querywithrownumbers 
    group by val 
) q 
order by minRn 

这会给结果

8 
0 
15 

而如果你只使用UNION ALL你将最终

8 
0 
15 
0