【问题标题】:Select Union SQL选择联合 SQL
【发布时间】:2012-12-19 15:55:34
【问题描述】:

我正在使用以下查询:

select 8 Union Select 0 Union Select 15 

在列中填充这 3 个数字。我得到的结果是:

0  
8  
15

但我希望先出现 8,然后是 0,然后是 15,例如

8  
0  
15

我该怎么做?

【问题讨论】:

  • 为什么要按特定顺序排列这些?在查询它们所在的表时,其余的 SQL 不会认为它们是有序的。哎呀,我什至不会依赖带有自动生成键的插入顺序来完全符合您的期望(因为如果系统可以并行插入,您将任何潜在的订购扔出窗口)。如果您绝对需要按特定顺序排列它们,最好添加一个“排序”列。

标签: sql select union


【解决方案1】:

使用 UNION ALL 例如

select 8 UNION ALL Select 0 UNION ALL Select 15 

【讨论】:

  • 很高兴能提供帮助。如果我已经回答了您的问题,您能否将其标记为答案 - 应该有一个勾号让您指出这一点。这将帮助发现您的问题的其他人知道哪些回答可以解决问题。
【解决方案2】:

@SimonMartin 的答案适用于您提供的确切数据集,但请注意,如果您的数据集包含重复值,UNION ALL 将产生与 UNION 不同的结果。

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

如果您想将UNION 运算符的功能与UNION ALL 提供的排序功能结合起来,那么您需要从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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2021-06-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多