我有一个简单的sql语句,如下所示
案例1:
select 1 as a
union
select 2 as a
输出:此案例按预期工作
案例2:
select 1 as a
union
select 2 as b
输出:虽然在我的第二个选择中别名是'b',但它仍然显示别名'a'。
为什么不能从第二个select语句中获取别名?
我们如何让sql从第二个选择查询中选择别名?
案例3:
select 1
union
select 2 as b
输出:尽管我上面的第一个select语句没有任何别名但第二个仍然有,为什么结果仍显示'No column name'?
答案 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