【问题标题】:Inner Join returned values内连接返回值
【发布时间】: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_idemployee_id,我认为理解逻辑会稍微容易一些。

标签: mysql sql presto trino


【解决方案1】:

Emily 有两个任务,因此她的姓名记录会在连接中重复,每次匹配一次。我可能会使用存在逻辑在这里得到你想要的结果:

SELECT e.name
FROM employee e
WHERE EXISTS (SELECT 1 FROM task t WHERE t.employee_id = e.id);

用简单的英语阅读,上面的查询表示返回任何员工姓名(一次),我们可以在task 表中找到至少一项任务。

【讨论】:

  • 感谢这有帮助,但我只是对内连接的输出感到困惑,所以如果你是内连接,我知道它只返回两个表中都存在的记录。但我不明白的是,如果在其中一个表中,正在加入的 ID 存在超过 1 次,它返回的次数与存在的次数一样多?
  • @Chris90 我想我明白了你的疑问...是的,员工记录可以在联接中多次使用。因此,Emily 的员工记录在概念上被“回收”的次数与任务表中匹配记录的次数一样多。在这种情况下,我们最终得到了两条 Emily 记录。
  • 谢谢,我只是在概念上没有想到它,并且在查看上面那个简单的示例时感到困惑,如果我在一个带有两个表的订单 ID 上进行内部连接,并且一个表包含那个位置每 5 分钟订购一次,它将返回第二张表中的每条位置记录是否正确?
  • 是的,这听起来很正确。但是想一想:如果加入按照您之前的想法进行,那么您如何控制 2 条 Emily 记录中的哪条 被返回?你不能,所以这样的操作可能不是很有用。
  • 所以如果在原始场景中,她在员工表中有一条额外的记录,它会返回 emily 3 次?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多