以下是PERSONNEL表的定义:
ID NUMBER(9)
LAST_NAME VARCHAR2(25)
FIRST_NAME VARCHAR2(25)
MANAGER_ID NUMBER(9)
DEPT_IDNUMBER(9)
请看如下的SQL语句,它将返回以下的哪个结果
SELECTp.dept_id, p.first_name‖’’‖p.last_name employee,
c.first_name‖’’‖c.last_name coworker
FROM personnel p,personnel c
WHERE p.dept id=c.dept_id
AND
p.id<>c.id;A.它将显示每一个员工(employee)的部门号、名字和他们的经理的名字
B.它将显示每一个员工的部门号、名字和他们的全部同事(coworker)的名字
C.它将显示每一个部门、每一个部门中的经理和每一个部门中的全体员工
D.它将返回语法错误
参考答案:B
解析: 这一题比较复杂,该题测试对自连接的熟悉程度。根据本题的FROM子句,可以断定这是一个自连接语句,因为两个表名相同。根据WHERE子句中的条件,选项A可以排除,因为连接条件中都是使用的dept_id,这里并没有上下级的关系。基于同样的原因,选项C也可以排除。由于这个SQL语句是一个正确的语句,所以选项D是错误的。
实际上,这个SQL语句将显示每一个员工的部门号、名字和他们的全部同事(coworker)的名字,所以选项B是正确的。
在SELECT子句中,p.dept_id显示部门号,p.first_name‖’’‖p.last_name employee将员工的姓和名连在一起显示并将列的标题显示为EMPLOYEE, c.first_name‖’’‖c.last_namecoworker将同事的姓和名连在一起显示并将列的标题显示为COWORKER。
在WHERE子句中AND p.id<>c.id这一条件的目的是防止一个员工又显示成自己的同事(coworker)。