如何编写SQL查询显示dvdrental数据库中共享地址的客户姓名?
修复SQL查询:找出共享同一地址的客户
你的查询存在两个核心问题:
- 语法错误:
SELECT子句里a.address和COUNT(a.address_id)之间缺少逗号,这是执行报错的直接原因。 - 逻辑错误:按
c.first_name, c.last_name, a.address分组时,每个客户的姓名+地址组合都是唯一的,导致COUNT(a.address_id)永远等于1,HAVING条件永远无法满足,查不出任何结果。
正确的思路是先筛选出被多个客户共享的地址ID,再关联客户表和地址表获取对应客户信息。
修复后的查询语句
方法1:子查询筛选共享地址
SELECT c.first_name, c.last_name, a.address FROM customer c JOIN address a ON c.address_id = a.address_id WHERE c.address_id IN ( SELECT address_id FROM customer GROUP BY address_id HAVING COUNT(*) > 1 ) ORDER BY a.address, c.last_name;
方法2:JOIN方式替代子查询(性能更优)
SELECT c.first_name, c.last_name, a.address FROM customer c JOIN address a ON c.address_id = a.address_id JOIN ( SELECT address_id FROM customer GROUP BY address_id HAVING COUNT(*) > 1 ) shared_addr ON c.address_id = shared_addr.address_id ORDER BY a.address, c.last_name;
说明
- 子查询先定位所有被2个及以上客户使用的
address_id。 - 主查询仅保留这些地址对应的客户记录,最后按地址和姓氏排序,方便直观查看同一地址下的所有客户。
内容的提问来源于stack exchange,提问作者Baby E
相关产品推荐
相关产品推荐

