给由连接创建的表分配一个别名

3
我将加入如下所示的3个表 -
select *
from Employee as e inner join [Grant] as g
on e.EmpID = g.EmpID -- "virtual table"  
inner join Location as l
on l.LocationID = e.LocationID

从select到GrantID的代码似乎是一个“虚拟表”,因此可以与另一个表(Location)连接以执行三个表的连接。我想给这个虚拟表取一个别名,是否可行?如果可以,该怎么做?
注意:我使用的是SQL Server 2008 Express。

你正在使用哪种关系型数据库管理系统(RDBMS)? - Michael Fredrickson
@MichaelFredrickson - SQL Server 2008 Express - david blaine
为什么你想要两个表连接的别名? - Michael Fredrickson
在我目前编写的代码中,我要反复使用它。 - david blaine
3个回答

2

你不能仅仅这样做吗?

SELECT <columns>
FROM (SELECT <columns 2> FROM Employee as e INNER JOIN [Grant] as g on e.EmpID = g.EmpID) as t1
  INNER JOIN Location as l on t1.LocationID = l.LocationID

我不知道你想选择哪些列,因此使用了占位符。


我希望有类似这样的命令 - (在此处加入联接代码)ALIAS EmpGrant,EmpGrant inner join Location as l。 - david blaine
错误 - 列“EmpID”在“t1”中被多次指定。 - david blaine
我觉得你需要在内部查询中指定列,而不是使用通配符(*)。 - David Hoerster
好的,我选择了 e.empid 和 e.location id 以获得一些输出。为什么在内部选择中我必须放置一些列名称而不是 * 呢? - david blaine
你正在创建一个临时表,其列基于连接表的列名。你正在指定通配符,所以你得到了所有的列。表中的列名必须是唯一的。你正在创建冲突,因为你在两个表中具有相同的列名。所以你需要告诉引擎要选择哪些列,或为列指定别名。希望这有所帮助。 - David Hoerster

2
如何使用CTE(通用表达式)呢?就像这样:
WITH    my_cte
          AS ( SELECT   e.EmpID as e_EmpID, g.* -- expand column list to only include required columns
               FROM     Employee AS e
                        INNER JOIN [Grant] AS g ON e.EmpID = g.EmpID -- "virtual table"  

             )
    SELECT  *
    FROM    my_cte
            INNER JOIN Location AS l ON l.LocationID = my_cte.LocationID;

请注意,如果您在后续查询中多次引用公共表表达式(CTE),则整个查询将被重新执行。如果您需要多次引用CTE,请先将结果存储在临时表中,然后执行查询以加入临时表。


不知道CTE,临时表等。我是初学者。这些会改变我正在练习的数据库吗? - david blaine
不,CTE不会改变数据库,临时表也不会。 CTE的结果仅在查询执行时存在。由于这个原因,CTE也被称为“内联视图”,它们被写入查询中,仅在该查询执行期间存在。 - Orlando Colamatteo

1

也许这样可以。

select *
from (select * from Employee as e 
inner join [Grant] as g on e.EmpID = g.EmpID) as vt
inner join Location as l on l.LocationID = vt.LocationID

请确保在 EmployeeGrant 中列名不重复。


我希望有这样的命令 - (在此处加入连接代码) ALIAS EmpGrant,EmpGrant内部连接Location as l。 - david blaine
错误 - 列“EmpID”在“vt”中被多次指定。 - david blaine
由於EmpID在Employee和Grant中均存在作為一列,因此您必須為其中一個列名提供別名,以使其在列列表中唯一。SQL Server正在生成一個衍生表(也就是所謂的“內聯視圖”,與CTE相同),在任何表格中,所有列名都必須是唯一的。 - Orlando Colamatteo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接