union / union中的别名全部查询 - SQL Server

时间:2017-02-27 16:41:17

标签: sql-server tsql

我有一个简单的sql语句,如下所示

案例1:

select 1 as a 
union  
select 2 as a

输出:此案例按预期工作

enter image description here

案例2:

select 1 as a 
union  
select 2 as b

输出:虽然在我的第二个选择中别名是'b',但它仍然显示别名'a'。

为什么不能从第二个select语句中获取别名?

我们如何让sql从第二个选择查询中选择别名?

enter image description here

案例3:

select 1 
union  
select 2 as b

输出:尽管我上面的第一个select语句没有任何别名但第二个仍然有,为什么结果仍显示'No column name'?

enter image description here

2 个答案:

答案 0 :(得分:4)

让我们尝试在这里教一些有用的东西。它不仅仅是UNION。有一个模式定义规定了SQL语言的规则,它被称为SQL ANSI。您可以在此处查看此定义的时间表:Database Administration - ANSI SQL Standards and Guidelines

这个定义背后的原因很容易理解。由于 select 1 as a UNION select 2 操作将两个查询的结果转换为一个,因此必须应用一些规则,如字段名称的定义,字段的类型(按顺序选择)和其他一些规则。

别名部分仅适用于第一个,因为数据库无法确定哪个列在联合操作中是正确的,因为每个结果将获得一行:

 a
 1
 2

这将导致:

 -a
  1
 -b
  2

因为如果为UNION堆栈中的每个SQL命名每一列,数据库将如何显示为ROWS?

_registerHelper

这就是应用第一个查询别名规则的原因。

SQL ANSI文档不是免费的,但如果你挖掘得足够多,你可以在PDF中找到它的早期版本。祝你好运:)(提示:我的个人资料中有一个工作链接的答案;))

答案 1 :(得分:2)

您可以将所有内容包装在一个SELECT周围,并根据您的需要为该列添加别名。

select a as [b] -- just alias it here with whatever you want
from (
    select 1 as a 
    union  
    select 2 as b
    ...) result_set

但正如@Will所说,它就是它,不能改变它。

请确保您使用顶部所需的“别名”查询,并UNION使用包含其他查询/值的单个SELECT语句。

select 2 as b

union

select a
from (
    select 1 as a
    union
    select 3 as c
    union
    ... ) result_set