Plan zajęć
- Instrukcja CASE
- Wyrażenie CTE (Common Table Expression)
- Rekurencja w CTE
- Polecenie INSERT, UPDATE i DELETE w CTE
W ramach zajęć zostaną przedstawione dwa rozwiązania technologiczne wspierające przetwarzanie danych w ramach polecenia SELECT. Na początek wprowadzimy instrukcję CASE umożliwiającą testowanie wartości. Kolejnym omawianym zagadnieniem będzie wyrażenie tabelaryczne CTE (ang. Common Table Expression) umożliwiające budowanie rozbudowanych zapytań do bazy danych włącznie z rekurencją.
Na początek zmodyfikujemy bazę Kurs dodając dodatkowe tabele. Schemat ERD zmodyfikowanej bazy danych przedstawia rys.1.
- Dodajemy tabelę zajecia
CREATE TABLE zajecia ( id_kurs int, id_zaj int ); ALTER TABLE zajecia ADD PRIMARY KEY ( id_kurs, id_zaj ); ALTER TABLE zajecia ADD FOREIGN KEY ( id_kurs ) REFERENCES kurs ( id_kurs ) ;
- Dodajemy tabelę uczest_zaj
CREATE TABLE uczest_zaj ( id_kurs int, id_zaj int, id_uczest int, obec int); ALTER TABLE uczest_zaj ADD PRIMARY KEY ( id_kurs, id_zaj, id_uczest ); ALTER TABLE uczest_zaj ADD FOREIGN KEY ( id_kurs, id_zaj) REFERENCES zajecia ( id_kurs, id_zaj ) ; ALTER TABLE uczest_zaj ADD FOREIGN KEY ( id_uczest) REFERENCES uczestnik ( id_uczestnik ) ;
- Wypełniamy tabelę zajecia danymi.
WITH RECURSIVE add_records (id_kurs, n) AS ( SELECT id_kurs, 1 FROM kurs UNION ALL SELECT id_kurs, n+1 FROM add_records WHERE n<10 ) INSERT INTO zajecia SELECT * FROM add_records; - Wypełniamy tabelę uczest_zaj danymi (średnie uczestnictwo 80%).
INSERT INTO uczest_zaj SELECT id_kurs, id_zaj, u.id_uczest, CASE WHEN RANDOM() < .7 THEN 1 ELSE 0 END AS obec FROM zajecia z JOIN uczest_kurs u USING(id_kurs) ORDER BY id_kurs, id_zaj, 3 ;