2

以下に示すように、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つのテーブルの結合を実行できます。この仮想テーブルにエイリアスを付けたいと思います。それは可能ですか?はいの場合、どうすればよいですか?

-SQLServer2008Expressを使用しています

4

3 に答える 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

選択しようとしている列がわからないため、プレースホルダーです。

于 2012-12-20T23:00:07.577 に答える
2

CTE (Common Table Expression) はどうですか? このような:

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 を複数回参照する必要がある場合は、最初に結果を一時テーブルに格納してから、クエリを実行して一時テーブルに対して結合することを検討してください。

于 2012-12-20T23:34:55.297 に答える
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

と で列名が繰り返されないように注意してEmployeeくださいGrant

于 2012-12-20T22:59:00.517 に答える