oracle 将新列添加到按值分组的表中

qv7cva1a  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(155)

我有一个Circus表如下
| 马戏团标识|马戏团日期|马戏表演价格|
| - -|- -|- -|
| 一个|2020年12月9日|七十八人|
| 2个|2021年1月12日|八十二人|
和票据表,如下所示
| 票证标识|马戏团标识|票证类别|
| - -|- -|- -|
| 一个|一个|成人|
| 2个|一个|学生|
| 三个|一个|子项|
| 四个|2个|成人|
| 五个|2个|子项|
| 六个|2个|成人|
并且我希望通过添加名为ticket_sold的新列来更改circus表,其值应如下所示
| 马戏团标识|马戏团日期|马戏表演价格|已售出门票|
| - -|- -|- -|- -|
| 一个|2020年12月9日|七十八人|三个|
| 2个|2021年1月12日|八十二人|三个|
这是我试过的

alter table circus add ticket_sold numeric(3) default 0;
 update circus set ticket_sold = (select count(ticket_id) from ticket group by circus_id);

它给我一个错误说

single-row subquery returns more than one row
sczxawaw

sczxawaw1#

一般来说,不要这样做,因为这样做会导致ticket_sold列很快与ticket表不同步。
如果您想要动态更新数据行,请执行下列动作:

1.使用视图。

您可以在需要时计算该值:

CREATE VIEW circus_view (circus_id, circus_date, circus_show_price, tickets_sold) AS
SELECT c.circus_id,
       c.circus_date,
       c.circus_show_price,
       (SELECT COUNT(*) FROM ticket t WHERE t.circus_id = c.circus_id)
FROM   circus c;

2.使用触发器。

如果必须在circus表中保留票证数,则:

ALTER TABLE Circus ADD tickets_sold NUMBER;

CREATE TRIGGER circus_tickets
  AFTER INSERT OR UPDATE OR DELETE ON Ticket
BEGIN
  UPDATE Circus c
  SET tickets_sold = (SELECT COUNT(*) FROM ticket t WHERE t.circus_id = c.circus_id);
END;
/

fiddle

hfwmuf9z

hfwmuf9z2#

Is is not group by clause you need because query then returns number of tickets per each circus, but - then you get as many rows as there are circus_id s in the ticket table. Instead, correlate subquery to the main table:

update circus c set 
  c.ticket_sold = (select count(t.ticket_id) 
                   from ticket t
                   where t.circus_id = c.circus_id
                  );

相关问题