是否可以编写一个 SQL 查询来对两个表执行 'find and replace'?
Is it possible to write an SQL query that does a 'find and replace' with two tables?
详情
我有两个table:
预订Table(出于组织目的,我按日期将它们分开)
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
房间Table
Name Seats
1 10
2 20
3 30
4 40
5 50
6 60
每个房间在每个日期只会出现一次,或者根本不会出现。他们也是在“最适合”的基础上,如中间 3 所示,Rebecca 和 Dasher 都需要 30 个座位,但由于 Rebecca 得到了 3 号房间,这是最适合她的房间(30 个座位),Dasher 必须得到下一个“最适合”他请求的 30 个座位的房间是 4 号房间,有 40 个可用座位。
现在我必须从两个 table 中“删除”一个房间:所以之后的 table 会是这样的:
预订Table(删除房间 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
房间Table(删除房间3后)
Name Seats
1 10
2 20
4 40
5 50
6 60
所以我想写一个 SQL 查询来找到合适的房间,供在预订中删除房间的人使用 table。
例如,对于日期 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;
首先我 select 我想展示的东西。然后我想找到特定日期不存在的房间。
然后我想找到第一个适合的房间,所以我使用“MIN()”函数来做到这一点,因为例如,对于日期 1,如果我没有使用 MIN() 函数,它将 return 两个值:Room 4 和 Room 5 因为它们都可供 Rebecca 使用。希望使用“MIN()”只会 return 房间 4。
最后我按日期对查询进行分组,以便它适用于每个日期。
澄清一下,我还不需要插入任何数据,只是 returned。如果简单地插入数据更容易,那很好,但是获得 returned 的东西才是我真正想要的。
我遇到了语法错误(太多了,比如 GROUP BY 是不允许的,或者不能像那样使用 MIN)。当我修复这些错误时,我什么也得不到。不知道该怎么做。这在 SQL 中可能吗?
Each person will reserve a room separately. For example, Jim wants to reserve a room with 25+ seats for 01/1/2020. Rooms 1,3,6 are already reserved, room 2 does not match, so rooms 4 and 5 are matching and available, and room 4 must be shown/reserved for him. You do not need to investigate the reservations for another dates. Jim simply enters "01/1/2020" and "25 places" and receives "room 4". That's all. Is it? – Akina
@Akina yes, that's right. I was using java for my inputs and removal. now I just need SQL to return me the values for each one and then I'll use java to insert them. but if SQL has the functionality perhaps I don't need to use JAVA at all. – PSU Change
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
作为金额,则查询将 return 4
。如果 Jim 同意,则此房间将被保留,并将相应的行插入到 Reservations 中。如果他不同意,他可能会更改金额 and/or 日期,并可能会收到另一个房间或根本拒绝预订房间。
您也可以删除 LIMIT 1
- 在这种情况下,吉姆会看到 2 个预订变体,房间 4
和 5
。由于某些原因(例如,保留价格可能会影响),他将select其中之一,并将根据信息添加到table。
详情
我有两个table:
预订Table(出于组织目的,我按日期将它们分开)
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
房间Table
Name Seats
1 10
2 20
3 30
4 40
5 50
6 60
每个房间在每个日期只会出现一次,或者根本不会出现。他们也是在“最适合”的基础上,如中间 3 所示,Rebecca 和 Dasher 都需要 30 个座位,但由于 Rebecca 得到了 3 号房间,这是最适合她的房间(30 个座位),Dasher 必须得到下一个“最适合”他请求的 30 个座位的房间是 4 号房间,有 40 个可用座位。
现在我必须从两个 table 中“删除”一个房间:所以之后的 table 会是这样的:
预订Table(删除房间 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
房间Table(删除房间3后)
Name Seats
1 10
2 20
4 40
5 50
6 60
所以我想写一个 SQL 查询来找到合适的房间,供在预订中删除房间的人使用 table。
例如,对于日期 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;
首先我 select 我想展示的东西。然后我想找到特定日期不存在的房间。
然后我想找到第一个适合的房间,所以我使用“MIN()”函数来做到这一点,因为例如,对于日期 1,如果我没有使用 MIN() 函数,它将 return 两个值:Room 4 和 Room 5 因为它们都可供 Rebecca 使用。希望使用“MIN()”只会 return 房间 4。
最后我按日期对查询进行分组,以便它适用于每个日期。
澄清一下,我还不需要插入任何数据,只是 returned。如果简单地插入数据更容易,那很好,但是获得 returned 的东西才是我真正想要的。
我遇到了语法错误(太多了,比如 GROUP BY 是不允许的,或者不能像那样使用 MIN)。当我修复这些错误时,我什么也得不到。不知道该怎么做。这在 SQL 中可能吗?
Each person will reserve a room separately. For example, Jim wants to reserve a room with 25+ seats for 01/1/2020. Rooms 1,3,6 are already reserved, room 2 does not match, so rooms 4 and 5 are matching and available, and room 4 must be shown/reserved for him. You do not need to investigate the reservations for another dates. Jim simply enters "01/1/2020" and "25 places" and receives "room 4". That's all. Is it? – Akina
@Akina yes, that's right. I was using java for my inputs and removal. now I just need SQL to return me the values for each one and then I'll use java to insert them. but if SQL has the functionality perhaps I don't need to use JAVA at all. – PSU Change
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
作为金额,则查询将 return 4
。如果 Jim 同意,则此房间将被保留,并将相应的行插入到 Reservations 中。如果他不同意,他可能会更改金额 and/or 日期,并可能会收到另一个房间或根本拒绝预订房间。
您也可以删除 LIMIT 1
- 在这种情况下,吉姆会看到 2 个预订变体,房间 4
和 5
。由于某些原因(例如,保留价格可能会影响),他将select其中之一,并将根据信息添加到table。