Sql 为联接生成的表指定别名

Sql 为联接生成的表指定别名,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我将加入如下所示的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的代码似乎是一个虚拟表。因此,它可以与另一个表位置连接以执行3表连接。我想给这个虚拟表一个别名。可能吗?如果是,我该怎么做 注- 我使用s

我将加入如下所示的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的代码似乎是一个虚拟表。因此,它可以与另一个表位置连接以执行3表连接。我想给这个虚拟表一个别名。可能吗?如果是,我该怎么做

注- 我使用sql server 2008 express

也许这样就可以了

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

请确保列名在Employee和Grant中不会重复。

您就不能这样做吗

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

我不知道您要选择哪些列,因此占位符是空的。

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,首先考虑将结果存储在临时表中,然后对临时表执行查询以联接。

您使用的是哪些RBDM?@MichaelFredrickson-sql server 2008 Expression为什么要为两个表的联接使用别名?在我当前编写的代码中反复使用它。我希望有这样的命令-此处的联接代码别名EmpGrant,EmpGrant内部联接位置为l。错误-为“vt”多次指定了列“EmpID”。由于EmpID作为列存在于Employee和Grant中,因此必须为其中一列提供别名,以使其在列列表中唯一。SQL Server正在生成一个派生表a.k.a.一个与CTE相同的内联视图,并且在任何表中,所有列名都必须是唯一的。我希望有这样的命令-此处的连接代码别名为EmpGrant,EmpGrant内部连接位置为l.error-为“t1”多次指定了列“EmpID”。我认为您必须在内部查询中指定列,而不是使用通配符*。好的,我选择了e.EmpID和e.Location id以获得一些输出。为什么我必须在内部select中放置一些列名而不是*呢?您正在创建一个临时表,其列基于联接表的列名。您指定了一个通配符,因此将获得所有列。表中的列名必须是唯一的。您正在创建冲突,因为两个表中的列名相同。因此,您需要告诉引擎要选择哪些列,或者为这些列指定别名。希望这有帮助。不知道CTE,临时表等。我是一个初学者。这些会改变我正在练习的数据库吗?不会,CTE不会改变数据库,临时表也不会。CTE的结果仅在查询执行时存在。由于这个原因,CTE也称为内联视图,它们被写入查询中,并且仅在该查询执行期间存在。