1

このツリー テーブルに参加してデータを取得しようとすると、SQL クエリで問題が発生します。Oracle データベースを使用しています。

Personal

id_no   name
-------------    
0001    John
0002    Peter
0003    Mike

position
id_no  name
-------------
0001  programmer
0002  Engineer
0003  Clerk

extra_skill
employee_id    skill
--------------------------
0001         Visual Studio 2008
0003         Crystal Report

要件: 従業員の詳細を表示する:

例:

Employee No : 0001
Employee Name : John
Employee Position : Programmer
Employee Skill : Visual Studio 2008

私のSQL文は

SELECT a.id_no, a.name, b.name, c.skill
  FROM personal a, POSITION b, extra_skill c
 WHERE a.id_no = b.id_no
   AND b.id_no = c.employee_id
   AND c.employee_id = "USER INPUT";

問題はいつ

SELECT a.id_no, a.name, b.name, c.skill
  FROM personal a, POSITION b, extra_skill c
 WHERE a.id_no = b.id_no
   AND b.id_no = c.employee_id
   AND c.employee_id = "0002";

テーブルの extra_skill に 0002 がないため、このクエリでは NULL が返されます。

3番目のテーブルに値がない場合でもデータを取得できるようにしたい。

Expected result:
  Employee No : 0002
  Employee Name : Peter
  Employee Position : Engineer
  Employee Skill : 

このようなクエリを実装するにはどうすればよいですか?

あなたの注意と助けに感謝します。ありがとう、シティ..:)

4

2 に答える 2

3

これを行う方法は、外部結合を使用することです。この例では、ANSI 結合構文 (Oracle 9i で導入) を使用しました。これは、より明確であり、オラクルでも使用が推奨されているためです。

SELECT a.id_no, a.name, b.name as position, c.skill 
  FROM personal a INNER JOIN position b
        on (a.id_no = b.id_no )
      LEFT OUTER JOIN extra_skill c 
       on ( a.id_no = c.employee_id )
WHERE a.id_no = '0002'; 

PERSONAL.ID を選択するようにフィルター条件を変更したことに注意してください。(質問のように)使用しようとするc.employee_id = '0002'と、行が返されません。


WHERE 句ではなく、結合条件に EXTRA_SKILLS.EMPLOYEE_ID を含めることができます。

SELECT a.id_no, a.name, b.name as position, c.skill  
FROM personal a INNER JOIN position b 
    on (a.id_no = b.id_no ) 
  LEFT OUTER JOIN extra_skill c  
   on ( a.id_no = c.employee_id  
        and c.employee_id = '0002'); 

通常、結合セクションにフィルターを含めることは、結果セットに予期しない影響を与える可能性があるため、良い方法とは見なされません。あなたの場合、PERSONAL と POSITION のすべての行が返され、EXTRA_SKILL の値は返されません。これはおそらくあなたが望んでいることではありません。これを証明する SQL Fiddle を次に示します。

于 2012-07-25T07:49:23.937 に答える
-1

外部結合を使用する必要があります。外部結合の目的は、一致しない行を含めることであり、外部結合はこれらの不足している列を NULL 値として返します。

SELECT a.id_no, a.name, b.name, c.skill
  FROM personal a, POSITION b, extra_skill c
WHERE a.id_no = b.id_no
AND b.id_no = c.employee_id
AND c.employee_id(+) = "USER INPUT";
于 2012-07-25T07:41:12.200 に答える