SQL:根据另一个表的计数结果更新一个表中的列

问题描述 投票:1回答:3

我有一个名为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));

但是,当我尝试执行此操作时,出现“单行子查询返回多个行”错误。

是否有更直接的方法来解决此问题?

提前感谢!

sql oracle sql-update
3个回答
2
投票

您可以使用相关子查询在此处进行更新:

UPDATE guest g
SET guest_nobookings = (SELECT COUNT(*) FROM hotel_booking hb
                        WHERE hb.guest_no = g.hotel_bookingno);

您可能需要对上述内容进行一些改动才能使其正常工作。附带说明,您可能需要重新考虑设计,甚至避免进行此更新。原因是hotel_booking表中的状态每次更改时,计数合计可能变得无效,因此必须重新计算。通常,我们尝试避免在SQL中存储原始数据的聚合。


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;

干杯!


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子句更新表的另一种方法。

© www.soinside.com 2019 - 2024. All rights reserved.