这个联合国是什么意思?

时间:2010-09-08 18:17:36

标签: sql-server tsql

我想插入一个工会,有人建议:

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感到好奇。

编辑:好的,所以这是别名,但为什么需要这个呢?如果我删除它,它将不会执行。

6 个答案:

答案 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