仅允许使用一次SELECT的PostgreSQL查询问题求解
解决方案
正确的PostgreSQL查询如下:
SELECT c.customer_id, c.first_name || ' ' || c.last_name AS full_name, COUNT(r.rental_id) AS total_rentals FROM customer c INNER JOIN rental r ON c.customer_id = r.customer_id INNER JOIN inventory i ON r.inventory_id = i.inventory_id INNER JOIN film f ON i.film_id = f.film_id GROUP BY c.customer_id, c.first_name, c.last_name HAVING COUNT(CASE WHEN f.rating = 'NC-17' THEN 1 END) = 0 ORDER BY total_rentals DESC, c.last_name LIMIT 5;
关键修正说明:
- 替换过滤逻辑:原查询用
WHERE film.rating != 'NC-17'仅剔除了单条NC-17租赁记录,但有其他非NC-17租赁的客户仍会被统计。新的HAVING条件会检查分组后的客户是否存在任何NC-17租赁——统计结果为0时,说明该客户从未租过NC-17电影,完全符合题目排除要求。 - 调整JOIN类型:原查询的RIGHT JOIN会引入无对应库存的无效电影记录,全INNER JOIN确保只关联有实际租赁行为的客户、租赁记录、库存和电影数据。
- 简化分组字段:直接按
customer_id、first_name、last_name分组,比拼接后的full_name更清晰,也符合PostgreSQL的分组规则。
内容的提问来源于stack exchange,提问作者Hector Williams
相关产品推荐
相关产品推荐

