SAKILA 数据库 SQL 上的多个 JOINS

Posted

技术标签:

【中文标题】SAKILA 数据库 SQL 上的多个 JOINS【英文标题】:multiple JOINS on SAKILA database SQL 【发布时间】:2022-01-08 21:30:51 【问题描述】:

我正在学习 SQL 课程 (mysql),有人问我以下问题: *"在 Sakila,每个员工都有一个家庭住址,并被分配到一个商店。商店有地址 也。编写一个 SELECT 查询,返回每个人的名字、姓氏和城市名 其家庭地址 (staff.address_id) 和商店地址的员工 (store.address_id) 在同一个城市。 提示:

您至少需要 4 次联接才能正确处理。 结果将列出 2 名员工。"*

我以为我使用此查询通过 3 JOINS 完成了它:

use sakila;

select distinct first_name, last_name, city
from city 
join address on city.city_id = address.city_id
join staff on staff.address_id = address.address_id
join store ;

但有人告诉我,即使输出正确,查询也不完整(如果人员表中有更多行,它们仍会出现在输出中 - 我的查询忽略了商店的地址)。 这是我的输出:my output

你们能帮帮我吗? 非常感谢!

【问题讨论】:

ANSI SQL 对 每个 JOIN 都有一个 ON。然而,MySQL 再次以自己的方式做事。 基地是工作人员(staff表)。所有其他表都必须连接到它。你必须加入address和加入store,它们有自己的地址,独立于成员的地址,所以另一个独立的address表的副本必须加入store @jarlh 啊,不经常使用 MYSql 我真的不知道 - 这让我感到震惊,因为它能够忽视适当的分组,对于新手来说非常糟糕,尤其是对于学习低技能的人。跨度> 【参考方案1】:
SELECT staff.first_name, staff.last_name, city.city
FROM staff                                                       -- staff member
JOIN address address1 ON staff.address_id = address1.address_id  -- member's address
JOIN store ON staff.store_id= store.store_id                     -- members' store
JOIN address address2 ON store.address_id = address2.address_id  -- store's address
JOIN city ON address1.city_id = city.city_id                     -- member's city (may join to address2 and get store's city)
WHERE address1.city_id = address2.city_id                        -- check that member's city and store's city is the same city
first_name last_name city
Mike Hillyer Lethbridge
Jon Stephens Woodridge

https://dbfiddle.uk/?rdbms=mysql_8.0&sample=sakila&fiddle=bb4292dc30784ffbdc547e1daa1bf03c

【讨论】:

哇,非常感谢!最后一个问题,这句ON staff.store_id=store.store_id是不是意味着员工必须在他所在城市的商店工作? @Jov 不...为什么要“工作”?没有关系设置这个。 我是这么认为的,因为您通过商店 ID 将它们设置在一起,因此如果一名员工住在伍德里奇但被分配到莱斯布里奇商店,则不会显示。正如我所说,我对这种语言很陌生,所以你可能是对的。无论如何,非常感谢!

以上是关于SAKILA 数据库 SQL 上的多个 JOINS的主要内容,如果未能解决你的问题,请参考以下文章

SQL SELECT 结合 JOINS 和 CONTACTS 在一个选定字段中生成相同数据的多个条目

MySQL-创建示例数据库(sakila)

SQL 2 INNER JOINS 与 3 个表

用于在不同表上具有多个 LEFT OUTER JOINS 的 SQL 的 LINQ

What Joins 用于将多个表连接到一个视图中

内连接,外链接(左连接右连接全连接),交叉连接大总结+附SQL JOINS图解[转]