2010-07-16 96 views
9

我們可以爲單個表使用多個別名嗎?表的多個別名

+0

爲什麼你想要?你有一個不起作用的特定查詢嗎? – 2010-07-16 10:36:48

+0

你需要什麼? – 2010-07-16 10:37:48

+1

自我加入或生活在多個角色中的表格。後者的一個例子可能是一個日期維度表,它連接到一個事實表上,其中有幾個日期。 – ConcernedOfTunbridgeWells 2010-07-16 10:46:03

回答

11

是的。你需要F你有一個表,用於存儲層次結構來做到這一點的self join,例如:

create table Foo (
    FooID int 
    ,ParentFooID int 
    ,[columns] 
) 

你可以做一個加入以獲得符合特定條件與像查詢父母的孩子:

Select b.* 
    from Foo a 
    join Foo b 
    on a.FooID = b.ParentFooID 
    and [some condition filtering a] 
+1

+1推理的權力! – 2010-07-16 10:38:34

+0

但它會影響性能與否? – 2010-07-16 10:45:07

+0

查詢優化器必須做任何必要的操作來解析連接謂詞。例如,如果表很大並且在ParentFooID上有一個索引,它可能必須執行索引查找來解析FooID - ParentFooID連接。做比賽總是會涉及一些資源。 – ConcernedOfTunbridgeWells 2010-07-16 10:49:17

3

不,不在同一張桌子上,但可以選擇同一張桌子兩次並給每個別名。

SELECT alias1.*, alias2.* 
FROM mytable alias1, mytable alias2 

這將允許您在單個查詢中使用同一張表作爲其他用途。

+0

但它會影響性能與否? – 2010-07-16 10:46:57

+0

是的,如果您選擇兩次表格,那麼它將不得不做兩倍的工作。性能將取決於它們的使用方式,它們連接的內容以及查詢優化器可用的索引和統計信息。 – 2010-07-16 10:57:41

+0

由於Chris的查詢沒有連接條件(隱式或顯式),所以笛卡爾連接會被期望 - 即。表中的每一行都將與同一表中的所有行鏈接,因此如果表中有20行,結果集將爲400行!這比工作的兩倍還要糟糕。然而,這不是造成這項工作的別名 - 而是笛卡爾連接。 – 2010-07-16 11:57:32