无法替换SQL UNION查询表名

时间:2011-08-26 18:10:42

标签: sql union distinct sql-server-2008-r2

我在SQL Server 2008 R2中有两个具有相同架构的表。如果我执行以下查询,括号保持不变,我会从两个表中得到结果。

/*
select distinct Name, Rank, SerNo, OtherStuff from 
*/

(
select Name, Rank, SerNo, OtherStuff from OldPlayers

union 
select Name, Rank, SerNo, OtherStuff from NewPlayers
)

/*
OldPlayers
*/

go

如果我然后取消注释两个注释,并在括号中注释掉表达式,我也会得到结果(当然,从一个表中)。

如果我现在在最后重新评论表名,并取消注释括号表达式以便它可以替换表名,我会收到错误“语法不正确')'”。

为什么我不能用union表达式替换表名?

2 个答案:

答案 0 :(得分:4)

如果您这样尝试:

select Name, Rank, SerNo, OtherStuff from 
(
select Name, Rank, SerNo, OtherStuff from OldPlayers
union 
select Name, Rank, SerNo, OtherStuff from NewPlayers
) as Players

答案 1 :(得分:1)

我没有方便的SQL Server副本,但是当您将表的表达式用作查询的一部分时,情况并非如此 - 语法要求您命名结果表(除非它是查询的最外层部分,这样表名称将引用表本身)?因此,如果您使用“选择1”(我相信这是合法的)而不是联合查询,您仍然必须命名生成的“表”。

所以,

select distinct Name, Rank, SerNo, OtherStuff from 
(
select Name, Rank, SerNo, OtherStuff from OldPlayers
union 
select Name, Rank, SerNo, OtherStuff from NewPlayers
) SYNTAXREQUIRESTABLENAME

应该有用。