ChatGPT解决这个技术问题 Extra ChatGPT

什么是 SELF JOIN,什么时候使用它? [复制]

这个问题在这里已经有了答案:自联接的解释(13 个答案)2 年前关闭。

什么是自加入以及何时使用它?我不明白自我加入,所以用一个例子来做一个外行的解释会很棒。


D
D'Arcy Rittich

当表本身引用数据时,您使用自联接。

例如,Employee 表可能有一个 SupervisorID 列,该列指向作为当前员工老板的员工。

要在一行中查询数据并获取两个人的信息,您可以像这样自加入:

select e1.EmployeeID, 
    e1.FirstName, 
    e1.LastName,
    e1.SupervisorID, 
    e2.FirstName as SupervisorFirstName, 
    e2.LastName as SupervisorLastName
from Employee e1
left outer join Employee e2 on e1.SupervisorID = e2.EmployeeID

对我来说,这看起来像是一个自我外部连接?
@JoeCaruso 那是因为它是 ;)
我想知道为什么没有人强调“在同一行”部分。这不是自我加入的全部意义吗?
为表创建别名时我们不需要 AS 吗?
@ManuChadha AS 是可选的 - 我将根据查询的可读性来决定。
p
paxdiablo

一个典型的例子是你想获得一份员工及其直属经理的名单:

select e.employee as employee, b.employee as boss
from emptable e, emptable b
where e.manager_id = b.empolyee_id
order by 1

它基本上用于存储在同一个表中的行之间存在任何关系的地方。

雇员。

多层次营销。

机械零件。

等等...


Boo 用于非 ANSI 语法并在 ORDER BY 子句中使用序号而不是列名。
嘘,因为错过了答案的重点:-) 我倾向于使用最简单的语法,因为好的 DBMS 不会让这影响性能。
迄今为止最好的答案... :)
M
Mark Byers

自联接只是当您将表与自身联接时。没有 SELF JOIN 关键字,您只需编写一个普通的连接,其中连接中涉及的两个表都是同一个表。需要注意的一件事是,当您进行自联接时,必须为表使用别名,否则表名将不明确。

当您想要关联同一个表中的行对时,它很有用,例如父子关系。以下查询返回类别“厨房”的所有直接子类别的名称。

SELECT T2.name
FROM category T1
JOIN category T2
ON T2.parent = T1.id
WHERE T1.name = 'Kitchen'

很高兴看到这条评论.. ON T2.parent = T1.id (因为如果我们在其中交换“父”和“id”,它会影响结果)
值得一提的是没有 SELF JOIN 关键字。我对那部分感到困惑!
M
Michael Pakhantsov

SQL 自连接只是一个普通连接,用于将表连接到自身。

例子:

Select *
FROM Table t1, Table t2
WHERE t1.Id = t2.ID

使用 SELECT t1.* 以避免结果中出现重复的列名不是更安全吗?
W
Will A

您将在一个“引用”自身的表上使用自联接 - 例如,一个员工表,其中 managerid 是同一张表上的employeeid 的外键。

例子:

SELECT E.name, ME.name AS manager
FROM dbo.Employees E
LEFT JOIN dbo.Employees ME
ON ME.employeeid = E.managerid

ON ME.employeeid = E.managerid 将创建不同的结果,而不是 ON ME.managerid = E.employeeid