SQL- UNION:如何通过Order By联合4不匹配列的选择

问题描述 投票:0回答:3
SELECT 'ABC-D Header1' As Seq1
UNION
SELECT 'ABC-D Header2' AS seq2
UNION
SELECT  ABC-D data1 data2..3..data4 ' AS seq3
UNION
SELECT 'ABC-D Tail' AS Seq4
ORDER BY SEQ1 ASC

 OUTPUT:  
 ABC-D data1 data2..3..data4
 ABC-D Header1
 ABC-D Header2     
 ABC-D Tail

EXPECTED RESULT :

ABC-D Header1
ABC-D Header2
ABC-D data1 data2..3..data4
ABC-D Tail

谁能帮我UNION在内部的工作方式,我正在处理硬编码的值,该值应分为两行(Header1,Header2),后跟数据和Tail部分。我也尝试过ASC和DESC,似乎无法按预期提供准确的结果。

任何帮助将不胜感激。

sql sql-server select union multi-select
3个回答
1
投票

为所需的顺序添加另一列

SELECT 'ABC-D Header1' As Seq1, s = 1
UNION
SELECT 'ABC-D Header2' AS seq2, s = 2
UNION
SELECT  'ABC-D data1 data2..3..data4 ' AS seq3, s = 3
UNION
SELECT 'ABC-D Tail' AS Seq4, s = 4
ORDER BY s ASC

0
投票
select Seq1
from
(
SELECT 'ABC-D Header1' As Seq1, number = 1
UNION
SELECT 'ABC-D Header2' AS seq2, number = 2
UNION
SELECT  'ABC-D data1 data2..3..data4 ' AS seq3, number = 3
UNION
SELECT 'ABC-D Tail' AS Seq4, number = 4
) a 
ORDER BY number ASC

或者您也可以像这样使用Desired table而不使用多余的列

SELECT Seq1
FROM(
 VALUES
 ('ABC-D Header1'),
 ('ABC-D Header2'),
 ('ABC-D data1 data2..3..data4 '),
 ('ABC-D Tail')
)v(Seq1)

Result here

enter image description here


0
投票

您在每行之后放置的别名-seq1seq2等实际上不是该行的别名,而是该列的别名。您只有一列,将被称为seq1,因为这是您在联合中的第一选择上为其赋予的别名。其他别名将被简单丢弃。

我也同意,如果您不希望更改给定的顺序,则不应放置ORDER BY子句。

但是,SQL不保证以任何特定顺序返回结果集。尽管通常这种简单的硬编码值联合将没有理由以您给定的顺序以外的其他任何顺序返回,但这不是必须的。如果要确保特定的订购,应采用以下方式:

SELECT 'ABC-D Header1' As description, 1 as seq
UNION
SELECT 'ABC-D Header2', 2
UNION
SELECT 'ABC-D data1 data2..3..data4 ', 3
UNION
SELECT 'ABC-D Tail', 4
ORDER BY seq

实际上,我认为您正在尝试这样做。我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.