【发布时间】:2021-05-26 11:27:12
【问题描述】:
我有一个查询,例如,
select name
from employee
inner join task on employee.id = task.employee_id
order by name asc
表格如下:
员工
id name
1 Emily
2 Sam
3 AI
4 Joe
5 Daniel
6 John
任务
task_id employee_id
A123 1
D456 3
A122 1
我相信上面的原始查询会导致:
Al
Emily
但实际上是:
Al
Emily
Emily
我认为它只会返回一次 Emily,因为内部连接在两个表中都返回了两个值,但是 Emily 不是只在员工表中出现一次吗?我不明白为什么它会返回 Emily 两次,即使它在任务表中列出了两次?
谢谢
【问题讨论】:
-
...因为 Emily 有 2 个任务。
-
使用
select name, task_id ...你就会明白为什么了。 -
联接本质上是笛卡尔积 (a x b)。您的是其中的一个子集(a x b,其中 a 和 b 都是 Emily) - 这是一个过度简化,但对于您的示例来说足够正确。
-
Emily exists in both but it returns as many rows as she exists in?是的,这正是发生的事情。这样想,join发现 Emily 在task中有两个关系,它不会随机决定你想要哪一个,所以它只会给你两行。 -
在这种情况下改变你的
select,所以它还包括task表中的task_id和employee_id,我认为理解逻辑会稍微容易一些。