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 在一个选定字段中生成相同数据的多个条目