2016-10-15 7 views
0

従業員の姓、従業員ID、その従業員のマネージャの姓、およびそのマネージャのIDを示すクエリを作成する必要があります。サブクエリ内でスーパークエリの値を使用するにはどうすればよいですか?

最後の名前、ID、およびそれは次のように十分であることを意味1行にすでにあるので、その従業員のマネージャIDを行うのは簡単です:

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

しかしのLAST_NAMEを取得しますマネージャー、従業員から取得したマネージャー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; 

しかし、(私がいることを期待ものの)「MANAGER_ID」はサブクエリでは動作せず、出力は(管理者IDの、他のすべての列が行うNULLであると思われます値を持つ)。

だから私の質問は、私はサブクエリで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

あなたが何をしているのかを明確に説明する時間をとってここと理由。経験の少ない仲間を助ける意欲は非常に高く評価されます。 – 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でない場合にのみ、あなたはこれを避けることができるようにWHERE条件

+0

私はそれがにクエリを変更して動作させることができました: ' a.last_name、a.employee_id、 を(b.employee_id = a.manager_id従業員からのb.last_nameを選択)、 は をa.manager_id 'しかし、ゴードン・リノフからのクエリは変更せずに働いていたので、私は彼の答えを受け入れるだろう。a.manager_idがNULLでない場合、従業員から内はb.employee_id = a.manager_id ON従業員bを登録しよう。 – Nathan

+2

'、b.last_name従業員WHERE employee_id = manager_id'が完全に間違っています –

+0

回答更新...削除されました.. – scaisEdge

1

作業に参加あなたは外側のクエリテーブルがサブクエリのテーブルと同じであれば、あなたの場合のようにtable.fieldか、のような完全なテーブル名を使用するか必要がある、外部クエリ内のテーブルを参照したい、あなたはにエイリアスを割り当てる必要があります外部クエリテーブルを作成し、次のようにサブクエリで使用します。

あなたが必要なもの10
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

これは大抵正しいですし、 "最小限の"解決策(厳密には必要ない場合でも、テーブルのサブクエリコピーにテーブルエイリアスを使用するようアドバイスしていますが、確かに非常に良いアドバイスです)。外部クエリのエイリアスは必須で、ここに表示されます。しかし、2つのポイント:Oracleでは、テーブルエイリアスの前にキーワード「AS」を使用することはできません(構文エラーが発生します)。あなたは(OPTIONALLY!)列エイリアスの前に "AS"という言葉を使うことができます。そして、一般的には、表の(非常に)短いエイリアスを使用することが最善です。 "emp_outer"は技術的には正しいですが、たくさん使うとタイピングになるでしょう。 – mathguy

+0

@mathguy私は最小限の解決策と長いエイリアスを提供しましたので、OPには外部テーブルを参照する方法が明確になりました。私はオラクルをあまり使用しないので、オラクルがそれを許可していないことを知っていませんでした..ありがとう – rohitvats

関連する問題