我有一个名为GUEST
的表和一个名为HOTEL_BOOKING
的表。
我想更新GUEST
表中名为guest_nobookings
的列(这是客人在酒店预订的数量)。
我可以通过基于旅客人数对酒店的预订人数进行计数,从HOTEL_BOOKING
表中获得旅客的预订人数。
这是我到目前为止所拥有的:
SELECT COUNT(hotel_bookingno)
FROM hotel_booking
GROUP BY guest_no;
这给了我每个住在酒店的客人的预订数量。要更新GUEST表,我已经尝试过:
UPDATE guest
SET (guest_nobookings = (SELECT COUNT(hotel_bookingno)
FROM hotel_booking
GROUP BY guest_no));
但是,当我尝试此操作时,出现“单行子查询返回多个行”错误。
有没有更直接的方法来解决这个问题?
谢谢!
答案 0 :(得分:2)
您可以使用相关子查询在此处进行更新:
UPDATE guest g
SET guest_nobookings = (SELECT COUNT(*) FROM hotel_booking hb
WHERE hb.guest_no = g.hotel_bookingno);
您可能需要稍作更改以使其起作用。附带说明,您可能需要重新考虑设计,甚至避免进行此更新。原因是,hotel_booking
表中的状态每次更改时,计数聚合可能会变得无效,因此必须重新计算。通常,我们尽量避免在SQL中存储原始数据的聚合。
答案 1 :(得分:0)
为什么要在两个表中保存合理的数据?这将导致其中之一的数据不一致。 (如Tim所描述)
我的建议是将view
的所有详细信息都使用guest
,并在视图中使用hotel_bookings
表中的使用计数。
如果您确实要更新计数,则可以使用merge
语句,如下所示:
Merge into guest g
Using (select COUNT(*) as cnt, hb.guest_no
FROM hotel_booking hb
GROUP BY hb.guest_no) hb
On (hb.guest_no = g.hotel_bookingno)
When matched then
Update set g.guest_nobookings = hb.cnt;
干杯!
答案 2 :(得分:0)
UPDATE guest
SET guest_nobookings = (
WITH t1 AS (
SELECT COUNT(*) no_bk, guest_no FROM hotel_booking
GROUP BY hotel_booking.guest_no
)
SELECT no_bk FROM t1
WHERE guest_no = guest.hotel_bookingno
);
这是使用WITH子句更新表的另一种方法。