如何筛选所有菜品单价均高于10的餐厅及对应菜品信息?
解决方法
方法一:使用NOT EXISTS子查询排除存在低价菜品的餐厅
这种方法通过子查询检查每个餐厅是否存在单价≤10的菜品,只保留完全没有低价菜品的餐厅及其所有菜品:
SELECT r.name AS restaurant_name, fi.name AS food_name, fi.price FROM restaurant r JOIN food_item fi ON r.id = fi.restaurant_id WHERE NOT EXISTS ( SELECT 1 FROM food_item fi2 WHERE fi2.restaurant_id = r.id AND fi2.price <= 10 );
方法二:通过GROUP BY + HAVING筛选符合条件的餐厅
先分组统计每个餐厅的最低菜品价格,筛选出最低价格>10的餐厅(说明该餐厅所有菜品单价都高于10),再关联获取对应的菜品信息:
SELECT r.name AS restaurant_name, fi.name AS food_name, fi.price FROM restaurant r JOIN food_item fi ON r.id = fi.restaurant_id JOIN ( SELECT restaurant_id FROM food_item GROUP BY restaurant_id HAVING MIN(price) > 10 ) valid_restaurants ON r.id = valid_restaurants.restaurant_id;
方法三:使用窗口函数标记餐厅最低价格
通过窗口函数给每条菜品记录标记所属餐厅的最低菜品价格,再筛选出最低价格>10的记录:
SELECT restaurant_name, food_name, price FROM ( SELECT r.name AS restaurant_name, fi.name AS food_name, fi.price, MIN(fi.price) OVER (PARTITION BY r.id) AS min_restaurant_price FROM restaurant r JOIN food_item fi ON r.id = fi.restaurant_id ) sub WHERE min_restaurant_price > 10;
以上三种方法都能精准排除存在低价菜品的餐厅,最终只输出所有菜品单价均高于10的餐厅名称、菜品名称及单价。
内容的提问来源于stack exchange,提问作者Martin Zanony
相关产品推荐
相关产品推荐

