sql-server - 如何使用 SELECT 语句中的可用值更新表
问题描述
概述
我正在尝试使用 SQL 服务器上的存储过程来解决“分配”问题,而不是在我们的 Access 应用程序中使用 VBA 代码。该问题类似于将可用的航班座位分配给机票,如此SQL Fiddle所示
表
航班
+----------+--------------+
| FlightID | FlightNumber |
+----------+--------------+
| 1 | L1044 |
| 2 | T553 |
| 3 | AC1105 |
+----------+--------------+
座位(针对 FlightID 2 过滤)
+--------+----------+------------+
| SeatID | FlightID | SeatNumber |
+--------+----------+------------+
| 104 | 2 | F21 |
| 105 | 2 | A22 |
| 106 | 2 | B33 |
+--------+----------+------------+
机票(针对 FlightNumber T553 过滤)
+----------+--------------+--------+
| TicketID | FlightNumber | SeatID |
+----------+--------------+--------+
| 5003 | T553 | (null) |
| 5005 | T553 | (null) |
| 5006 | T553 | (null) |
| 5007 | T553 | (null) |
+----------+--------------+--------+
问题
给定一个特定的FlightNumber
,我如何更新表格以使用表格中的可用值Ticket
填充,请记住每个座位 ID 只能使用一次。此外,如果可能的话,我希望能够在交易中做到这一点。SeatID
Seat
预期结果:
+----------+--------------+--------+
| TicketID | FlightNumber | SeatID |
+----------+--------------+--------+
| 5003 | T553 | 104 |
| 5005 | T553 | 105 |
| 5006 | T553 | 106 |
| 5007 | T553 | (null) |
+----------+--------------+--------+
解决方案
您可以为派生表中的每张票和每个座位分配行号,加入行号,然后复制SeatID
. 行编号确保只有一个座位被分配给一张票。
我建议您为每个表选择一个合适的排序列。
UPDATE t
SET SeatID = s.SeatID
FROM (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY t.FlightNumber ORDER BY t.TicketID)
FROM Ticket t
WHERE t.FlightNumber = 'T553'
) t
JOIN Flight f ON f.FlightNumber = t.FlightNumber
JOIN (
SELECT *,
rn = ROW_NUMBER() OVER (PARTITION BY s.FlightID ORDER BY s.SeatID)
FROM Seat s
) s ON s.FlightID = f.FlightID AND s.rn = t.rn;
推荐阅读
- react-native - ios 10 中的 Linking.openURL(jumpUrl) 无法打开网址:tel xxx
- sql - 如何为已解码的列添加条件
- react-native - 有没有一种方法可以使用 PHP 为每个特定用户显示 MySQL 表值,以便在反应本机应用程序中查看他们的个人资料?
- flutter - 如何使用计数器方法增加颤动中淡入淡出动画的时间?
- c++ - vector.reserve(10000000) 的缺点是因为我想保留原始内存位置?
- sql - sql 两个where子句从一个表变成两个新行
- sql - 之前和之后的 SQL 子字符串
- angular - 在Angular 10中使用ng测试进行测试时如何克服业力中的NullInjector错误
- python - 如何在熊猫数据框中输入列表作为列值?
- php - PayPal Smart Button 服务器端实现 - 捕获交易的问题 - PHP