我想插入一个工会,有人建议:
SELECT x INTO ##temp
FROM (SELECT x FROM y UNION ALL SELECT x FROM z) UN
它有效,但UN
是什么?不幸的是,谷歌搜索“t-sql un”并不是很有帮助:p
注意:我发现您可以SELECT x INTO ##temp FROM y UNION ALL SELECT x FROM b
但我仍然对UN
感到好奇。
答案 0 :(得分:10)
这不是关键字。这是别名。可以在那里使用任何字符串而不是“UN”。
更完整的形式是:
SELECT x INTO ##temp
FROM (SELECT x FROM y UNION ALL SELECT x FROM z) AS UN
@Tomalak是对的。在这种情况下,别名是必需的。没有别名,错误是:
Msg 102,Level 15,State 1,Line 2 ')'附近的语法不正确。
我稍微简化了查询并使用了AdventureWorks数据库:
SELECT * INTO ##temp
FROM (SELECT * FROM Person.Address)
这会收到上面的错误。相反:
SELECT * INTO ##temp
FROM Person.Address
工作得很好。另一种选择是
;WITH UN AS
(
SELECT * FROM Person.Address
)
SELECT * INTO ##temp
FROM UN
答案 1 :(得分:4)
这是必需的,因为这是派生表,并且派生表需要具有名称。这不行吗?我没有看到你需要派生表。
SELECT x
INTO #Temp
FROM y
UNION ALL
SELECT x
FROM z
我改为常规临时表,因为全局的临时表通常是个坏主意,因为其他连接会影响它们。如果你真的需要一个然后使用它,否则要非常小心使用gloabl临时表。
答案 2 :(得分:3)
在此上下文中是alias
。没有un
T-SQL命令。然后,您可以使用该字段引用您的字段。
SELECT un.x INTO ##temp
FROM (SELECT x FROM y UNION ALL SELECT x FROM z) UN
答案 3 :(得分:1)
在这种情况下,UN
是子查询((SELECT x FROM y UNION ALL SELECT x FROM z)
)的结果集的别名。您可以将UN
替换为您喜欢的任何内容,只要它不会混淆解析器。
答案 4 :(得分:1)
所有这一切都是别名(SELECT x FROM y UNION ALL SELECT x FROM z)到“UN”
答案 5 :(得分:0)
别名/相关名称为结果集提供临时名称,以便可以在查询的其他位置引用它。此示例显示别名需要能够引用select和join子句中的子查询中的字段。如果子查询没有别名,则服务器将不知道从哪个表获取字段'y'。需要使用别名来区分子查询的两个不同角色。
select A.*, B.y
from
(select id, f, k, y from Table1) A
join
(select id, t, y, s from Table2) B
on A.id = B.id