SQL自联接 - 在WHERE子句中分配哪个别名?

时间:2017-10-20 09:08:41

标签: sql oracle

我试图了解在WHERE子句中分配表别名的逻辑是什么。

下面是employee表中常用的示例,其中Supervisor Name是通过内部联接创建的。

表中的主键是emp_id,外键是emp_supv

SELECT
    a.emp_id AS "Emp_ID",
    a.emp_name AS "Employee Name",
    b.emp_id AS "Supervisor ID",
    b.emp_name AS "Supervisor Name"
FROM employee a, employee b
WHERE a.emp_supv = b.emp_id

我真的不理解WHERE条款...将别名a分配给emp_supv而不是emp_id的逻辑是什么?

2 个答案:

答案 0 :(得分:2)

就像有两张不同的牌桌。

使用其他别名

可能更容易理解
SELECT
    t_employee.emp_id AS "Emp_ID",
    t_employee.emp_name AS "Employee Name",
    t_supervisor.emp_id AS "Supervisor ID",
    t_supervisor.emp_name AS "Supervisor Name"
FROM employee t_employee , employee t_supervisor
WHERE t_employee.emp_supv = t_supervisor.emp_id

您在主管表(t_supervisor)中搜索存储在员工表(t_employee)中 emp_up emp_supv 的行

答案 1 :(得分:0)

如果WHERE声明是:

 a.emp_id = b.emp_id

然后您会说主管和员工的员工ID是相同的,因此为主管和员工检索的数据将是相同的(例如,员工姓名将等于主管姓名)。

但如果你的意思是为什么它不像:

a.emp_id = b.emp_supv

然后由表a表示的员工将成为表b所代表的员工的主管(员工姓名实际上是员工的主管名称,其ID等于{{ 1}})