2012-07-25 33 views
1

我在嘗試加入此樹表並獲取數據時遇到了sql查詢問題。我正在使用Oracle數據庫。具有多個條件的sql查詢,但某些項目在某些表中不可用

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"; 

該查詢返回NULL,因爲表extra_skill沒有0002

我想它可能甚至在第三個表中沒有值獲取數據。

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

我該如何實現這樣的查詢?

您的關注和幫助非常感謝。 謝謝,Siti .. :)

+0

感謝j0k爲您編輯.. :) – Siti 2012-07-25 07:31:59

回答

3

要做到這一點的方法是使用外連接。本例中我使用了ANSI連接語法(在Oracle 9i中引入),因爲它更清晰,現在Oracle也推薦使用它。

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中沒有任何值。這可能不是你想要發生的事情。這裏是a SQL Fiddle to prove it

+0

yey !! ..我的問題解決了!..謝謝你的幫助.. :) – Siti 2012-07-26 03:29:56

-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"; 
+0

此示例不起作用。你需要外連接*所有*缺陷表的列。它也沒有提供OP想要的答案。 – APC 2012-07-25 08:05:04