如何实现:同一FlightNum下A舱座位为0时批量设置SoldOut列值为1?
问题描述
- 表格包含列:
FlightNum、Class、Seats、SoldOut - 示例数据:FlightNum为10的A舱
Seats值为0,其余舱位有剩余座位 - 需求:编写SQL语句,当同一
FlightNum下Class为A的Seats等于0时,将该FlightNum对应的所有行的SoldOut列设为'1' - 当前进展:仅考虑到
CASE语句,需要技术实现指导
实现方案
方法1:子查询关联更新(兼容多数数据库)
先筛选出A舱售罄的航班号,再批量更新这些航班的所有行:
UPDATE your_table t1 INNER JOIN ( SELECT FlightNum FROM your_table WHERE Class = 'A' AND Seats = 0 ) t2 ON t1.FlightNum = t2.FlightNum SET t1.SoldOut = '1';
方法2:窗口函数实现(适用于PostgreSQL、SQL Server、MySQL 8.0+等)
通过窗口函数标记每个航班是否存在A舱售罄的情况,再执行更新:
UPDATE your_table SET SoldOut = '1' WHERE FlightNum IN ( SELECT FlightNum FROM ( SELECT FlightNum, MAX(CASE WHEN Class = 'A' AND Seats = 0 THEN 1 ELSE 0 END) OVER (PARTITION BY FlightNum) AS a_sold_out_flag FROM your_table ) sub_query WHERE a_sold_out_flag = 1 );
关于CASE语句的补充说明
单独的CASE语句无法跨行判断同一航班的全局状态,必须结合子查询或窗口函数才能完成更新。如果只是查询时标记状态,可使用以下语句:
SELECT FlightNum, Class, Seats, CASE WHEN EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.FlightNum = t1.FlightNum AND t2.Class = 'A' AND t2.Seats = 0 ) THEN '1' ELSE SoldOut END AS SoldOut FROM your_table t1;
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

