我有一个名为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));
但是,当我尝试执行此操作时,出现“单行子查询返回多个行”错误。
是否有更直接的方法来解决此问题?
提前感谢!
您可以使用相关子查询在此处进行更新:
UPDATE guest g
SET guest_nobookings = (SELECT COUNT(*) FROM hotel_booking hb
WHERE hb.guest_no = g.hotel_bookingno);
您可能需要对上述内容进行一些改动才能使其正常工作。附带说明,您可能需要重新考虑设计,甚至避免进行此更新。原因是hotel_booking
表中的状态每次更改时,计数合计可能变得无效,因此必须重新计算。通常,我们尝试避免在SQL中存储原始数据的聚合。
为什么要在两个表中使用相同的数据?这将导致其中之一的数据不一致。 (如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;
干杯!
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子句更新表的另一种方法。