I have a Circus table as follow
circus_id | circus_date | circus_show_price |
---|---|---|
1 | 09-12-2020 | 78 |
2 | 12-01-2021 | 82 |
and a Ticket table as follow
ticket_id | circus_id | ticket_category |
---|---|---|
1 | 1 | Adult |
2 | 1 | Student |
3 | 1 | Children |
4 | 2 | Adult |
5 | 2 | Children |
6 | 2 | Adult |
and i want to alter the circus table by adding a new column called ticket_sold and the value should be as follow
circus_id | circus_date | circus_show_price | ticket_sold |
---|---|---|---|
1 | 09-12-2020 | 78 | 3 |
2 | 12-01-2021 | 82 | 3 |
this is what I have tried
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);
it gives me an error said
single-row subquery returns more than one row
CodePudding user response:
In-general, don't, as you will end up with a ticket_sold
column that rapidly becomes out-of-sync with the ticket
table.
If you want to have a dynamically updating column then:
1. Use a view.
You can just compute the value whenever you need it:
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. Use a trigger.
If you must persist the number of tickets in the circus
table then:
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;
/
CodePudding user response:
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
);