2016-10-15 16 views
0

我需要創建一個查詢,顯示員工的姓氏,員工ID,該員工的經理姓氏以及該經理的ID。如何在子查詢中使用superquery中的值?

姓氏,ID,以及該員工的經理ID是很容易做到,因爲它已經在一排,這意味着以下就足夠了:

SELECT last_name, employee_id, manager_id FROM employees WHERE manager_id IS NOT NULL; 

但得到的姓氏經理,你必須通過你從員工那裏得到的經理ID來搜索同一張表。我找到了解決辦法是:

SELECT last_name, 
     employee_id, 
     (SELECT last_name FROM employees WHERE employee_id = manager_id), 
     manager_id 
FROM employees 
WHERE manager_id IS NOT NULL; 

然而,似乎是「經理標識」並沒有在子查詢工作(雖然我預計),輸出爲NULL(對於經理ID,其他所有欄目做有價值)。

所以我的問題是,我怎麼能在子查詢中使用manager_id?

備註:每個員工的manager_id可能不同,因此使用常量值不起作用。

回答

2

你需要的是一個相關的子查詢。我強烈建議您在全部查詢中使用表別名和列名。但是,這些對於相關子查詢來說尤其重要。

SELECT e.last_name, e.employee_id, 
     (SELECT m.last_name 
     FROM employees m 
     WHERE m.employee_id = e.manager_id 
     ), 
     e.manager_id 
FROM employees e 
WHERE e.manager_id IS NOT NULL; 

別名e是在外部查詢表參考employees縮寫:

,你應該寫這個查詢。別名m是子查詢中表引用的縮寫。

請注意,全部列引用使用表別名。這使查詢明確無誤,可以防止意外錯誤,並使查詢更容易讓您和其他人理解。

+0

+1用於抽出時間來清楚地解釋你在做什麼這裏和爲什麼。非常感謝幫助經驗較少的研究員。 – mathguy

1

你可以使用一個自內連接(帶相同的表連接)

SELECT 
     a.last_name 
    , a.employee_id 
    , b.last_name 
    , a.manager_id 
FROM employees a 
INNER JOIN employees b ON b.employee_id = a.manager_id; 

內部聯接只有a.manager_id不是null工作,所以你能避免這個地方條件

+0

我能夠得到它通過改變查詢工作:'選擇 a.last_name,a.employee_id, (SELECT b.last_name FROM僱員WHERE b.employee_id = a.manager_id), a.manager_id FROM employees a INNER JOIN employees b ON b.employee_id = a.manager_id WHERE a.manager_id不爲NULL;'但是Gordon Linoff的查詢沒有修改就工作,所以我會接受他的回答。 – Nathan

+2

',b.last_name FROM employees WHERE employee_id = manager_id'完全錯誤 –

+0

答案更新...拒絕刪除.. – scaisEdge

1

當你想引用外部查詢中的表,你需要使用完整的表名,如table.field,或者如你的情況那樣,如果外部查詢表與子查詢表相同,則需要爲其分配一個別名外部查詢表並將其用於子查詢中,如下所示:

SELECT 
last_name, employee_id, 
(SELECT last_name FROM employees WHERE employee_id = emp_outer.manager_id),  
manager_id 
FROM employees emp_outer 
WHERE manager_id IS NOT NULL; 
+0

這大部分都是正確的,並且「最小」解決方案(儘管Gordon建議使用表別名作爲表的子查詢副本確實是非常好的建議,即使不是嚴格要求)。外部查詢的別名是必需的,並且是您在此顯示的內容。但是,有兩點:在Oracle中,不能在表別名之前使用關鍵字「AS」(這會引發語法錯誤)。您只能(可選)在列別名之前使用「AS」一詞。而且,通常最好使用(非常)簡短的別名來表格。 「emp_outer」在技術上是正確的,但是如果你使用它的話,它會很多輸入。 – mathguy

+0

@mathguy我提供了一個最小的解決方案和一個長的別名,這樣OP就可以清楚地知道如何引用一個外部表。關於'as'關鍵字的好處,我不知道oracle不允許它,因爲我沒有太多使用Oracle ..謝謝 – rohitvats

相關問題