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

这个查询给我NULL,因为在表extra_skill 没有0002。

我希望即使在第三张表中也能获取数据,没有任何价值。

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

如何实现这样的查询?

非常感谢您的关注和帮助。谢谢你,西蒂.. :)

4

2 回答 2

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'(就像您在问题中所做的那样),您将不会返回任何行。


您可以在连接条件中包含 EXTRA_SKILLS.EMPLOYEE_ID 而不是 WHERE 子句。

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 回答