【问题标题】:Is it possible to write an SQL query that does a 'find and replace' with two tables?是否可以编写一个使用两个表进行“查找和替换”的 SQL 查询?
【发布时间】: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&lt;=table2.seats)
  • 将它们添加到您的问题中,作为edit@PSUChange 以及导致所述错误的声明。帮助这里的用户帮助你。
  • 你的源数据很奇怪。 Rooms 表与日期无关。 Reservations 表取决于日期,房间在不同的日子重复使用。因此,需要的第一步是生成一张桌子,其中每个房间都与预订中提到的每个日期相结合。此表和预订必须是处理源,您将“删除”的不是 romm,而是一对(房间日期)。这将是合乎逻辑的。

标签: sql database datatable derby


【解决方案1】:

每个人将单独预订一个房间。例如,Jim 想为 2020 年 1 月 1 日预订一个有 25 个以上座位的房间。房间 1,3,6 已经预订,房间 2 不匹配,所以房间 4 和 5 匹配并且可用,房间 4 必须显示/保留给他。您无需调查其他日期的预订情况。 Jim 只需输入“2020 年 1 月 1 日”和“25 个地点”并收到“房间 4”。就这样。是吗? ——秋名

@Akina 是的,没错。我使用 java 进行输入和删除。现在我只需要 SQL 将每个值返回给我,然后我将使用 java 插入它们。但如果 SQL 有这个功能,也许我根本不需要使用 JAVA。 – 电源变化

SELECT Room.Name 
FROM Room 
LEFT JOIN Reservation ON Room.Name = Reservation.RoomName
                     AND Reservation.Date = {entered date}
WHERE Reservation.RoomName IS NULL
  AND Room.Seats >= {entered amount}
ORDER BY Room.Seats ASC LIMIT 1

如果(在当前数据状态下)Jim 输入 01/1/2020 作为日期,25 作为金额,则查询将返回 4。如果 Jim 同意,则保留此房间并将相应的行插入到 Reservations 中。如果他不同意,他可能会更改金额和/或日期,并可能会收到另一个房间或完全拒绝预订房间。

您也可以删除 LIMIT 1 - 在这种情况下,Jim 将看到 2 个预订变体,房间 45。他会因某些原因(例如,可能影响预订价格)选择其中之一,并将相应的信息添加到表格中。

【讨论】:

  • 对不起,我以为您的意思是“到那时为止”,这就是正在发生的事情。我正处于用户选择要删除的“房间”的位置,我的 SQL 将根据删除的房间重新调整表。无论如何,谢谢你,我只会发布一个新问题,因为沟通不畅是我的错。我已经可以将值适当地插入到我的预订表中。我只需要在房间被拆除后重新调整我的桌子。
  • 嗯。 . .我无法指出确切的缺陷,但我认为这并不能完全解决问题。我很确定该解决方案需要递归 CTE,因此一旦重新分配了一个房间,之前分配的房间就可以分配给其他人。
  • @GordonLinoff 一旦一个房间被重新分配,之前分配的房间可以分配给其他人。 我认为重新分配和分配这个房间给其他人是两个独立的过程。它们之间存在一些数据状态。但是从这个状态来看,之前执行的操作没有区别。重新分配更新保留行或删除它但插入另一个。我不明白为什么可能需要递归。除了当这种保留/重新分配是某个输入表的内容时的选择,它们必须作为批处理执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 2020-03-29
  • 2018-07-19
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多