2011-09-01 211 views
1

我做下面的SQL呼叫使用一個表多次:在SELECT語句

SELECT dpt_id, 
dpt_title, 
dpt_active, 
dpt_parent 
FROM tbl_department ORDER BY dpt_title 

其中dpt_parent是上級部門ID(另一個部門的dpt_id)的整數值。

我希望上述調用的結果集包含該dpt_parent的dpt_title。我在這個初步嘗試如下:

SELECT dpt_id, 
dpt_title, 
dpt_active, 
dpt_parent, 
    (SELECT dpt_title 
    FROM tbl_department 
    WHERE tbl_department.dpt_id = dpt_parent 
    ) AS parent_title 
FROM tbl_department ORDER BY dpt_title 

有了這種形式的調用,PARENT_TITLE的所有值都爲空 我可以看到使用這樣的同桌是混亂的,該如何解決這個問題?

回答

3

使用一個表的別名:

SELECT dpt_id, 
x.dpt_title, 
x.dpt_active, 
x.dpt_parent, 
    (SELECT dpt_title 
    FROM tbl_department 
    WHERE tbl_department.dpt_id = x.dpt_parent 
    ) AS parent_title 
FROM tbl_department x ORDER BY dpt_title 

,但你會更好刪除子選擇和剛剛加盟,如:

SELECT 
    a.dpt_id 
    ,a.dpt_title 
    ,a.dpt_active 
    ,a.dpt_parent 
    ,b.dpt_title parent_title 
FROM tbl_department  a 
LEFT JOIN tbl_department b ON a.dpt_parent = b.dpt_id 
ORDER BY a.dpt_title, b.dpt_title 
+2

嵌套查詢對性能來說是危險的,查詢分析器並不總是「看到」它可以執行JOIN。這裏顯式的JOIN更好。 – Lucero

+0

@Lucero,如果OP的第一個代碼示例發生了變化,所以它會起作用,第二個示例是它應該如何寫入。 –

+0

@KM,我同意,但我在評論你實際添加第二個例子之前。所有好現在;) – Lucero

2
SELECT d.dpt_id, 
d.dpt_title, 
d.dpt_active, 
d.dpt_parent, 
p.dpt_title AS parent_title 
FROM tbl_department d 
LEFT JOIN tbl_department p 
    ON p.dpt_parent = d.dpt_id 
ORDER BY d.dpt_title 
+2

在選擇列名不明確,就需要使用別名上所有的人。 – Lucero

+0

@Lucero,謝謝,你是對的。我忘了改變他們。查詢已更新。 – EricZ

+0

這就是爲什麼你在第一個地方打我10秒...;) – Lucero

3
SELECT d.dpt_id, 
d.dpt_title, 
d.dpt_active, 
d.dpt_parent, 
p.dpt_title parent_title 
FROM tbl_department d 
LEFT JOIN tbl_department p ON d.dpt_parent = p.dpt_id 
ORDER BY d.dpt_title 
+0

+1有用,並解決問題! – fearoffours

0

我認爲解決的辦法是使參加同一個表或者你可以做一個用戶定義的函數,它的部門ID,並返回上級部門的名稱。

1

在我看來這個查詢需要被改寫爲:

SELECT dpt_id, 
dpt_title, 
dpt_active, 
dpt_parent, 
    (SELECT dpt_title 
    FROM tbl_department AS [dept2] 
    WHERE [dept2].dpt_id = [dept1].dpt_parent 
    ) AS parent_title 
FROM tbl_department AS [dept1] ORDER BY dpt_title 

否則SQL-server將不知道你正在談論的表的實例

+0

+1我喜歡這個解決方案,因爲它看起來很熟悉和可讀 – fearoffours

+0

@fear我很榮幸。 – Johan

1

我認爲你正在尋找類似的東西:

SELECT a.dpt_id, 
a.dpt_title, 
a.dpt_active, 
a.dpt_parent, 
b.dpt_title AS parent_title 
FROM tbl_department AS a 
INNER JOIN tbl_department AS b ON b.dpt_id = a.dpt_parent 
ORDER BY dpt_title