poi*_*ics 87
您可以将自联接视为两个相同的表.但在规范化中,您无法创建表的两个副本,因此您只需模拟两个具有自连接的表.
假设你有两个表:
emp1
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
Run Code Online (Sandbox Code Playgroud)
emp2
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
Run Code Online (Sandbox Code Playgroud)
现在,如果你想用他或她老板的名字得到每个员工的名字:
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
Run Code Online (Sandbox Code Playgroud)
这将输出下表:
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
Run Code Online (Sandbox Code Playgroud)
win*_*nas 19
当你有一个引用自己的表时,这很常见.示例:员工表,其中每个员工都可以拥有经理,并且您希望列出所有员工及其经理的姓名.
SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
Run Code Online (Sandbox Code Playgroud)
mjv*_*mjv 18
自联接是表与自身的连接.
一个常见的用例是表存储在它们之间具有层次关系的实体(记录).例如,包含人员信息(姓名,DOB,地址......)并且包括其中包括父亲(和/或母亲)的ID的列的表格.然后用一个小的查询就好了
SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago' -- Or some other condition or none
Run Code Online (Sandbox Code Playgroud)
我们可以在同一查询中获得有关孩子和父亲(以及母亲,第二次自我加入等,甚至是父母等等)的信息.
假设你有一张桌子users
,设置如下:
在这种情况下,如果您想在一个查询中提取用户的信息和经理的信息,您可能会这样做:
SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
Run Code Online (Sandbox Code Playgroud)
想象一个Employee
如下所述的表。所有员工都有一个也是员工的经理(也许除了 CEO,他的 manager_id 将为空)
Table (Employee):
int id,
varchar name,
int manager_id
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用以下选择来查找所有员工及其经理:
select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31324 次 |
最近记录: |