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

时间:2019-10-20 03:56:49

标签: sql oracle sql-update

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

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

有没有更直接的方法来解决这个问题?

谢谢!

3 个答案:

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