【发布时间】:2021-03-08 08:19:56
【问题描述】:
详情
我有两张桌子:
预订表(出于组织目的,我按日期将它们分开)
Date Name Room Name Seats Requested
01/1/2020 John 1 10
01/1/2020 Rebecca 3 30
01/1/2020 Haley 6 55
01/2/2020 David 1 10
01/2/2020 Rebecca 3 30
01/2/2020 Dasher 4 30
01/3/2020 Roger 4 40
01/3/2020 Doe 5 50
01/3/2020 Smith 3 30
餐桌
Name Seats
1 10
2 20
3 30
4 40
5 50
6 60
每个房间在每个日期只会出现一次,或者根本不会出现。它们也处于“最合适”的基础上,如中间 3 所示,Rebecca 和 Dasher 都需要 30 个座位,但由于 Rebecca 得到了 3 号房间,这是最适合她的房间(30 个座位),Dasher 必须得到他要求的 30 个座位的下一个“最佳”试衣间是有 40 个座位的房间 4。
现在我必须从两张桌子上“移除”一个房间:所以之后的桌子会是这样的:
预订表(移除房间 3 后)
Date Name Room Name Seats Requested
01/1/2020 John 1 10
01/1/2020 Rebecca 30
01/1/2020 Haley 6 55
01/2/2020 David 1 10
01/2/2020 Rebecca 30
01/2/2020 Dasher 4 30
01/3/2020 Roger 4 40
01/3/2020 Doe 5 50
01/3/2020 Smith 30
房间桌子(移除房间 3 后)
Name Seats
1 10
2 20
4 40
5 50
6 60
所以我想编写一个 SQL 查询,它会找到合适的房间,这些房间可供在预订表中删除房间的人使用。
例如对于日期 1 (01/1/2020),丽贝卡失去了她的房间 3。这意味着她可以使用的下一个最佳房间是房间 4。
对于日期 2,我们看到 Rebecca 再次失去了她的 3 号房间,但这次使用的是 4 号房间,这意味着她可以使用的下一个最佳房间是 5 号房间。
在第 3 天,史密斯失去了他的房间 3。但由于房间 4 和 5 正在使用,他可以使用的下一个可用房间是房间 6
预期输出
我的理想输出应该是这样的:
Date Name Room Name Seats Requested
01/1/2020 Rebecca 4 30
01/2/2020 Rebecca 5 30
01/3/2020 Smith 6 30
这是我尝试过的
如上所示,我已经能够移除房间,因此没有必要这样做。下面是我正在尝试的 SQL 查询,但出现语法错误。
SELECT date,name,roomName,seatsRequested
FROM reservations table1
where not exists (select 1
from Room table2
where table1.roomName = table2.Name)
AND MIN(table1.seatsRequested<=table2.seats)
GROUP BY date;
首先,我选择要显示的内容。然后我想查找特定日期不存在的房间。
然后我想找到第一个适合的房间,所以我使用“MIN()”函数来做到这一点,因为例如,对于日期 1,如果我没有使用 MIN() 函数,它将返回两个值:Room 4 和 Room 5,因为它们都可供 Rebecca 使用。使用“MIN()”有望只返回 Room 4。
最后我按日期对查询进行分组,使其适用于每个日期。
澄清一下,我还不需要插入任何数据,只是返回。如果简单地插入数据更容易,那很好,但获取返回的东西确实是我想要的。
我遇到了语法错误(过多,不允许使用 GROUP BY 之类的东西,或者不能像那样使用 MIN)。当我修复这些错误时,我什么也得不到。不知道该怎么做。这在 SQL 中可行吗?
【问题讨论】:
-
我删除了不一致的数据库标签。请标记您真正使用的数据库。
-
您实际使用的是什么 RDBMS。 SQL Server 和 MySQL 完成了不同的产品。 “我遇到语法错误。” 这些错误是什么?
-
接下来肯定是语法错误:
MIN(table1.seatsRequested<=table2.seats) -
将它们添加到您的问题中,作为edit@PSUChange 以及导致所述错误的声明。帮助这里的用户帮助你。
-
你的源数据很奇怪。 Rooms 表与日期无关。 Reservations 表取决于日期,房间在不同的日子重复使用。因此,需要的第一步是生成一张桌子,其中每个房间都与预订中提到的每个日期相结合。此表和预订必须是处理源,您将“删除”的不是 romm,而是一对(房间日期)。这将是合乎逻辑的。
标签: sql database datatable derby