【问题标题】:SQL- UNION : How to UNION 4 SELECT of unmatched column by Order BySQL- UNION:如何按 Order By 对不匹配的列进行 UNION 4 SELECT
【发布时间】:2020-06-15 11:46:08
【问题描述】:
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),然后是数据和尾部部分。 我也尝试过 ASC 和 DESC,似乎没有任何效果可以提供预期的准确结果。

任何帮助将不胜感激。

【问题讨论】:

  • 删除order by就可以了
  • 结果集和表在定义上没有顺序。如果您希望行按特定顺序排列,则必须有一个 order by 子句使用反映您所需顺序的列。这是一个基本概念,您需要学习和理解才能在 sql 中取得成功。不要被您使用小型数据集或使用没有任何资源争用的机器所看到的任何顺序所误导。

标签: sql sql-server select union multi-select


【解决方案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

编辑: 如果您不希望在结果中包含s,请使用ctederived table

; WITH CTE AS
(
    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
)
SELECT  Seq1
FROM    CTE
ORDER BY s ASC

【讨论】:

  • 非常感谢,这很有效,我从来没有想过要再添加一个 col 和 sort。
  • @ShwetaReddy 。 . .当使用UNION ALL 时,请勿使用UNIONUNION 会产生删除重复项的开销。
  • @Squirrel 我们也可以在输出中删除 s 吗?没有仪式,我们只需要从前端调用所需的列,对吗?或者有什么办法可以隐藏's'
  • @ShwetaReddy 添加了查询
【解决方案2】:

您可以将VALUES 与位置一起使用:

SELECT t.Header
FROM ( VALUES (1, 'ABC-D Header1'), 
              (2, 'ABC-D Header2'), 
              (3, 'ABC-D data1 data2..3..data4 '), 
              (4, 'ABC-D Tail'))
     ) t(Seq, Header)
ORDER BY seq;

【讨论】:

  • @ShwetaReddy 。 . .这是最好的解决方案。
  • @Gordon Linoff 这个答案与this one 有何不同?
  • @Phong。 . .它没有订购列。这会有所不同。
  • 嗨@Yogesh Sharma,如您所见,它不需要额外的列。在线查看here快乐编码+1。
【解决方案3】:

这也是一种方法。与unpivot

select seq from 
(select convert(varchar(50), 'ABC-D Header1') as seq1
        , convert(varchar(50), 'ABC-D Header2') as seq2
        , convert(varchar(50),'ABC-D data1 data2..3..data4') as seq3
        , convert(varchar(50),'ABC-D Tail') as seq4) a
unpivot (seq for seq_order in ([seq1], [seq2], [seq3], [seq4])
) as b

here is a demo

使用convert 是因为没有它会引发错误,即 seq3 与 UNPIVOT 列表中指定的其他列的类型冲突

结果

【讨论】:

  • 不客气,乐于助人。感谢您的支持。干杯!
【解决方案4】:
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

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多