Efterår 2002 Note 13. Temaopgave svar



Relaterede dokumenter
Efterår 2002 Note 10. Temaopgave

Begrænsninger i SQL. Databaser, efterår Troels Andreasen

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form

Views etc. Databaser

Sidste forelæsning. Jacob Aae Mikkelsen. 28. april 2013 IMADA. Jacob Aae Mikkelsen (IMADA) Sidste forelæsning 28.

Import af rekursivt (parent-child) hierarki i Palo

Afleveringsopgave. Efterår 2001

Introduktion til SQL queries

De vigtigste SQL-sætninger. SQL kap Oprette database. DDL og DML

En opsamling af artefakter for Hotel Databasen som REST-service Bygger på Hotel opgaven i 8 trin

Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach 2002

Databaser Obligatorisk opgave 1

En Kort Introduktion til Oracle

Skriftlig eksamen i Databaser, Vinter 2001/2002. Pa opfordring har jeg udarbejdet mulige lsninger pa eksamensopgaverne, men

Skriftlig eksamen i. Databaser. Vinter 2002/2003. Vejledende løsninger

Databasesystemer. IT Universitetet i København 8. juni 2006

DB undervisning 01-01

Skriftlig eksamen i. Datalogi. Databaser. Sommer 2001

(fig.1. Eksempel på en almindelig entity)

Databasesystemer. IT Universitetet i København 7. juni 2005

Obligatorisk opgave 2. SQL, relationel algebra og relationel kalkyle

Eksamen, DSDS, efterår 2007

1. Basal select med (stjerne)

Funktionel afhængighed

Databasesystemer. IT Universitetet i København 16. januar 2006

Database. lv/

Objektorientering og databaser

Data lagring. 2. iteration (implement backend)

Introduktion til programmering

Trin 1 INSERT INTO Debitor (DebitorNr, KundeKategori, KreditMax, SidstRykket, Sælger ) VALUES (20121, 10, 40000, NULL, "Bjarne Larsen");

Opgave 1. Opret de 4 tabeller i FTSFrontend programmet. Indsæt mindst 3 forskellige tabelværdier i kunder, målerstatus, byer og regning..

Søren Løbner (lobner) ddb Databaser

Database design for begyndere

Anne Randorff Højen

Manglende konsistens i datamodellen og upræcise SQLsætninger er årsagen til, at mange IT-systemer fejler.

Databaseadgang fra Java

SQL Server 2008 Spatiale eksempler. Plan & Miljø, GIS

DOCUMENTATION FULLY DRESSED USE-CASE. 29. oktober 2012 [ TEMA PERSISTENS DOKUMENTATION] Use-case: Process Order

Få sin querystring til at fungere. (Nybegyndere)

Projekt titel. Projekt navn. Gruppe medlemmer. Klasse/Gruppenummer. Databaseprojekt 1. Ferrari

SQL Server 2016 Data Adgang

Eksempel på en database: studenter, kurser, eksamener

Eksamen, DSDS, efterår 2008

DML, Foresprgsler Relationel algebra + noget mere! af skemaer (overlap m. DDL)

Skriftlig eksamen i kurset. Informationssystemer

Views. Et view er en relation defined ud fra gemte tabeller ( base tables ) og andre views To typer:

Datalagring og formater

Databasesystemer. IT Universitetet i København 8. juni 2006

Air Crash Booking System

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

MsSQL: Basal performance tuning, part 1

Databasesystemer. Databaser, efterår Troels Andreasen. Efterår 2002

Database programmerings tips

Opgave 1 Basal select med (stjerne)

Relationel Algebra og SQL

Databasesystemer fra forskellige synsvinkler

Indholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:...

The Design Diaries Project 3 2. Semester. Blog om designprincipper

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

3. semester, 2. projekt: Database

Oracle PL/SQL. Overview of PL/SQL

1. Indholdsfortegnelse

A11: Last Year s Exam

Information Integration

Ratingsystem i PHP og MySQL

Conceptual, logic, physical

Databaser Obligatorisk opgave 2 Vejledende løsning

Anvisning i aflevering af bitemporale data

SQL-opgaver 5 løsning

Software Projekt NoSQL vs RMDB

HTML, PHP, SQL, webserver, hvad er hvad??

Skriftlig eksamen i. Databaser. Vinter 2002/2003

Projekt 1 Database. Cphbusiness Lyngby Multimediedesigner, 3. semester mul-a12e, gruppe 1

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

1 Indlæsning af script

Dorthes Bog Centrum har ca forskellige bøger (bibliografiske enheder), som alle skal være søgbare fra prototypen.

Tagwall med Php & MySQL

SQL for MySQL-begyndere

Eksamen, DSDS, forår 2008

Kursus/workshop: SQL

MapBasic brugergruppe. SQL i MapBasic. Peter Horsbøll Møller Senior Systems Engineer Marts Slå mute fra hvis I vil sige eller spørge om noget

Modul 2 Database projekt Multimediedesign 3. semester Gruppe 3 IRF/TUJE

Derfor vil jeg bygge dette eksempel på een table hvor der kan tilkyttes personer til ALLE noder og der kan tilføjes et vilkårligt antal niveauer

Fra ER-Diagram til Relationel model i 7 step

MapInfo Professional 11.0 Hvordan man tilgår en database

Værktøjer fra værktøjskassen. Søren Breddam, Stevns Kommune

Eksamen, DSDS, forår 2009

Begrynder til at lave log ind system

Projekt Database, Gruppe 4A. Projekt 1, 3. Semester D A T A B A S E. Klasse MulA13 Gruppenummer: A4

Jayne Alice Jensen [Link til portfolio]

Rigtig SQL Programmering

Ferieregnskab (Rapport-ID: 74)

Database "opbygning"

OPC ACCESS HEARTBEAT 1

Elaboration fase 2. semester projekt Gruppe 4

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

Notater til Avancerede Databaser. Vidar Jon Bauge 2007

Introduktion til OPC Access

Transkript:

Datalogi Database-kurset Efterår 2002 Note 13 Temaopgave svar Del 1: Design ved normalisering, svar fire tabeller p, ip, i og g (for hhv præparat, indholdsstof-i-præparat, indholdsstof og terapeutisk gruppe). Skema 1: p(pid, navn, virksomhed, gid, land, kkode) ip(iid, pid) i(iid, navn) g(gid, navn) Skema 2: p(pid, navn, virksomhed, gid, land, kkode, fid) ip(iid, pid) i(iid, navn) f(fid, navn) g(gid, navn, forældergid) I p (præparater) antages at pid -> navn, virksomhed virksomhed -> kkode virksomhed -> land pid ->> gid pid ->> fid I i (indholdsstoffer) antages at iid -> navn I f (farvestoffer) antages at fid -> navn navn -> fid I g (terapeutiske grupper) antages at gid -> navn gid -> forældergid Tilbage er nu kun at skabe et fornuftigt design for databasen. Dette er jeres opgave. Spørgsmål 1.1 Angiv først et database-skema, der er fremkommet ved at normalisere skema 2 ovenfor til BCNF. Skema 2: p(pid, navn, virksomhed, gid, land, kkode, fid) ip(iid, pid) i(iid, navn) f(fid, navn) g(gid, navn, forældergid)

denne p(pid, navn, virksomhed, gid, land, kkode, fid) dekomponeres pga. (pid -> navn, virksomhed) i p1(pid, navn, virksomhed, land, kkode) prest(pid, gid, fid) og yderligere dekomponeres p1 (virksomhed -> kkode) i p(pid, navn, virksomhed) v(virksomhed, land, kkode) som resultat fås: p(pid, navn, virksomhed) v(virksomhed, land, kkode) prest(pid, gid, fid) ip(iid, pid) i(iid, navn) f(fid, navn) g(gid, navn, forældergid) Spørgsmål 1.2+1.3 Angiv herefter et (eventuelt) modificeret skema, der svarer til skemaet fra spørgsmål 1 bragt på 4de normalform. denne prest(pid, gid, fid) må dekomponeres i gp(gid, pid) fp(fid, pid) så resultatet bliver p(pid, navn, virksomhed) v(virksomhed, land, kkode) gp(gid, pid) fp(fid, pid) ip(iid, pid) i(iid, navn) f(fid, navn) eller f(fid, navn) g(gid, navn, forældergid) eller, med mere sigende navne praep(pid, navn, virksomhed) virk(virksomhed, land, kkode) gruppepraep(gid, pid) farvepraep(fid, pid) indholdpraep(iid, pid) indhold(iid, navn) farve(fid, navn) gruppe(gid, navn, forældergid)

Del 2: ER i databasedesign, svar Spørgsmål 2.1 Spørgsmål 2.2 Tja

Del 3: Etablering og brug af database i SQL, svar I denne tredje del af temaopgaven skal en database etableres, der skal fyldes data i den og formuleres et udvalg af forespørgsler til den. Spørgsmål 3.1 Spørgsmål 3.2 describe lk.lkunorm Navn NULL? Type ----------------------------------------- -------- ---------------------------- VID NUMBER(38) IID NUMBER(38) PID NUMBER(38) FID VARCHAR2(6) GID NUMBER(38) PNAVN VARCHAR2(70) FORAELDER NUMBER(38) ATC VARCHAR2(10) GNAVN VARCHAR2(250) FNAVN VARCHAR2(70) INAVN VARCHAR2(70) VNAVN VARCHAR2(50) LAND VARCHAR2(8) KKODE NUMBER(38) virk(vid,vnavn, land, kkode) praep(pid, pnavn, vid) gruppe(gid, gnavn, foraelder) farve(fid, fnavn) indhold(iid, inavn) gruppepraep(gid, pid) farvepraep(fid, pid) indholdpraep(iid, pid) drop table virk cascade constraints; drop table gruppepraep cascade constraints; drop table farvepraep cascade constraints; drop table indholdpraep cascade constraints; drop table praep cascade constraints; drop table gruppe cascade constraints; drop table farve cascade constraints; drop table indhold cascade constraints; CREATE TABLE virk as SELECT DISTINCT vid,vnavn,land,kkode FROM lk.lkunorm WHERE vid IS NOT NULL;

CREATE TABLE praep as SELECT DISTINCT pid,pnavn,vid FROM lk.lkunorm WHERE pid IS NOT NULL; CREATE TABLE gruppe as SELECT DISTINCT gid,gnavn,foraelder FROM lk.lkunorm WHERE gid IS NOT NULL; CREATE TABLE farve as SELECT DISTINCT fid,fnavn FROM lk.lkunorm WHERE fid IS NOT NULL; CREATE TABLE indhold as SELECT DISTINCT iid,inavn FROM lk.lkunorm WHERE iid IS NOT NULL; CREATE TABLE gruppepraep as SELECT DISTINCT gid,pid FROM lk.lkunorm WHERE gid IS NOT NULL AND pid IS NOT NULL; CREATE TABLE farvepraep as SELECT DISTINCT fid,pid FROM lk.lkunorm WHERE fid IS NOT NULL AND pid IS NOT NULL; CREATE TABLE indholdpraep as SELECT DISTINCT iid,pid FROM lk.lkunorm WHERE iid IS NOT NULL AND pid IS NOT NULL; OBS (ej del af opgaveløsning): der var et dataproblem i lk-dataene som er løst med update gruppe set foraelder = null where foraelder=0 Men så skal man sørge for efterfølgende at føje begrænsninger på. Dette gøres med: ALTER TABLE virk ADD CONSTRAINT PK_virk PRIMARY KEY (VID); ALTER TABLE praep ADD CONSTRAINT PK_praep PRIMARY KEY (PID); ALTER TABLE praep ADD CONSTRAINT FK_praep_virk FOREIGN KEY (VID) REFERENCES virk (VID); ALTER TABLE gruppe ADD CONSTRAINT PK_gruppe PRIMARY KEY (GID); ALTER TABLE gruppe ADD CONSTRAINT FK_gruppe_gruppe FOREIGN KEY (FORAELDER) REFERENCES gruppe (GID); ALTER TABLE farve ADD CONSTRAINT PK_farve PRIMARY KEY (FID); ALTER TABLE indhold ADD CONSTRAINT PK_indhold

PRIMARY KEY (IID); ALTER TABLE gruppepraep ADD CONSTRAINT PK_gruppepraep PRIMARY KEY (GID, PID); ALTER TABLE gruppepraep ADD CONSTRAINT FK_gruppepraep_praep FOREIGN KEY (PID) REFERENCES praep (PID); ALTER TABLE gruppepraep ADD CONSTRAINT FK_gruppepraep_GR FOREIGN KEY (GID) REFERENCES gruppe (GID); ALTER TABLE farvepraep ADD CONSTRAINT PK_farvepraep PRIMARY KEY (FID, PID); ALTER TABLE farvepraep ADD CONSTRAINT FK_farvepraep_praep FOREIGN KEY (PID) REFERENCES praep (PID); ALTER TABLE farvepraep ADD CONSTRAINT FK_farvepraep_farve FOREIGN KEY (FID) REFERENCES farve (FID); ALTER TABLE indholdpraep ADD CONSTRAINT PK_indholdpraep PRIMARY KEY (IID, PID); ALTER TABLE indholdpraep ADD CONSTRAINT FK_indholdpraep_praep FOREIGN KEY (PID) REFERENCES praep (PID); ALTER TABLE indholdpraep ADD CONSTRAINT FK_indholdpraep_INDH FOREIGN KEY (IID) REFERENCES indhold (IID); Spørgsmål 3.3 Det resterende handler om forespørgsler til den etablerede database. Formuler, for hver af de nedenst[ende 3.1-3.8, spørgsmålet i SQL, udfør det mod databasen etableret i spørgsmål 2 og vis både forespørgsel og svar i besvarelsen. Det er IKKE meningen at der skal bruges hverken temporære tabeller eller views som mellemresultater på løsningerne herunder. For hvert af nedenstående spørgsmål gælder det, at det kan formuleres i ét samlet SQL-udtryk.

Bemærk også at ingen svar er særligt omfattende det højeste antal rækker i en resultat-tabel ligger omkring 20. Spørgsmål 3.3.1 virk(vid,vnavn, land, kkode) praep(pid, pnavn, vid) gruppe(gid, gnavn, foraelder) farve(fid, fnavn) indhold(iid, inavn) gruppepraep(gid, pid) farvepraep(fid, pid) indholdpraep(iid, pid) Hvilke indholdsstoffer findes i præparatet 'Omegaven'? ed 1 select inavn from praep p,indholdpraep ip,indhold i 2 where pnavn like 'Omegaven' 3* and p.pid=ip.pid and ip.iid=i.iid INAVN ---------------------------------------------------------------------- Glycerol Lecithin, Æg-phospholipid Fiskeolie Docosahexaenoinsyre (DHA) Eicosapentaenoinsyre (EPA) Spørgsmål 3.3.2 Hvilke præparater har indholdsstoffer der også findes i præparatet 'Omegaven'? 1 select distinct pnavn from praep p, indholdpraep ip 2 where p.pid=ip.pid and iid in (select iid from praep p,indholdpraep ip 3* where pnavn like 'Omegaven' and p.pid=ip.pid) PNAVN ---------------------------------------------------------------------- Clinoleic Glycerol "Oba" Glyoktyl "Medic" Intralipid Kabiven Liposyn Omegaven Structolipid

Vitrimix 9 rækker er valgt. Spørgsmål 3.3.3 Hvordan er fordelingen af antallet af indholdsstoffer over præparater (hvor mange præparater har netop 1 indholdsstof, hvor mange har 2 indholdsstoffer, hvor mange har 3 osv.)? Dette kan besvares ved et SQL-udtryk, der som resultat har en liste med en kolonne, der angiver antal indholdsstoffer, og en kolonne, der angiver hvor mange præparater der findes med det angivne antal indholdsstoffer. (Unden brug af temporære tabeller til mellemresultater) Tip: prøv f.eks. med en dobbelt-gruppering (en gruppering af en gruppering) list 1 select indhold,count(pid) antal_praep 2 from (select pid,count(iid) indhold from indholdpraep group by pid) 3* group by indhold INDHOLD ANTAL_PRAEP ---------- ----------- 1 1388 2 197 3 25 4 12 5 15 6 3 7 2 8 1 9 2 10 1 13 1 17 1 18 2 19 1 20 1 21 2 22 1 23 1 24 4 27 1 20 rækker er valgt. Spørgsmål 3.3.4 Hvor mange grupper er nederst i gruppehierarkiet (dvs. optræder ikke som forælder) ed

1 select count(*) from 2 (select gid from gruppe 3 minus 4* select foraelder from gruppe) COUNT(*) ---------- 1029 Spørgsmål 3.3.5 Hvor mange stier af længde 3 (gruppe A er forælder til gruppe B som er forælder til gruppe C) findes i gruppe-hierarkiet? ed 1 select count(*) from 2 (select distinct g3.gid 3 from gruppe g1,gruppe g2,gruppe g3 4* where g1.gid=g2.foraelder and g2.gid=g3.foraelder) COUNT(*) ---------- 920 Spørgsmål 3.3.6 Hvor mange grupper har hverken nogle tilhørende præparater eller en rolle som forælder til andre grupper. ed 1 select count(*) from ((select gid from gruppe 2 minus 3* select gid from gruppepraep) minus select foraelder from gruppe) COUNT(*) ---------- 388 Spørgsmål 3.3.7 Visse farvestoffer bruges kun af en virksomhed. Angiv navn for virksomhed og navn for farvestof for alle farvestoffer der kun bruges af en virksomhed.

list 1 select vnavn,fnavn 2 from virk natural join praep natural join farvepraep natural join farve 3 where fid in (select fid 4 from praep natural join farvepraep 5 group by fid 6* having count(distinct vid)=1) VNAVN FNAVN ---------------------- -------------------------------------------------- Durascan E123 - Amaranth Orphan Europe E129 - Allura Rød AC Wyeth Lederle E153 - Aktivt kul (Carbo medicinalis vegetabilis) Spørgsmål 3.3.8 Sammenlign medicinalvirksomhederne og find de par af virksomheder, der har størst lighed i den forstand, at der er flest terapeutiske grupper som de begge producerer medicin til. Formuler hertil en forespørgsel der angiver navne på par af virksomheder samt antal grupper, som de begge producerer medicin til. Medtag kun par af virksomheder der har mindst 15 (distinkte) grupper tilfælles. ed 1 select virk1.vid,virk2.vid,virk1.vnavn,virk2.vnavn,antalgrupper 2 from 3 (select vid1,vid2,count(distinct gid) antalgrupper 4 from (select vid vid1,gid from praep natural join gruppepraep) natural join 5 (select vid vid2,gid from praep natural join gruppepraep) 6 where vid1<vid2 7 group by vid1,vid2 8 having count(distinct gid) >= 15), virk virk1,virk virk2 9* where virk1.vid=vid1 and virk2.vid=vid2 VID VID VNAVN VNAVN ANTALGRUPPER ---------- ---------- ---------------------- ---------------------- ------------ 26 67 Alpharma Durascan 17 26 129 Alpharma Nycomed Danmark 22 67 68 Durascan Orion Pharma 16 67 82 Durascan GEA 26 67 84 Durascan Gerard 28 67 129 Durascan Nycomed Danmark 42 67 208 Durascan AstraZeneca 16 67 10094 Durascan 1A Farma 17 82 84 GEA Gerard 15 82 129 GEA Nycomed Danmark 22 82 10094 GEA 1A Farma 22 84 129 Gerard Nycomed Danmark 19 123 129 MSD Nycomed Danmark 19

129 208 Nycomed Danmark AstraZeneca 18 129 430 Nycomed Danmark Novartis 17 129 10069 Nycomed Danmark Aventis Pharma 15 129 10090 Nycomed Danmark Pharmacia 15 17 rækker er valgt.

Del 4: Programmering, svar virk(vid,vnavn, land, kkode) praep(pid, pnavn, vid) gruppe(gid, gnavn, foraelder) farve(fid, fnavn) indhold(iid, inavn) gruppepraep(gid, pid) farvepraep(fid, pid) indholdpraep(iid, pid) ed 1 create table ppraep 2 (pid number(38), 3 besk varchar2(500), 4* indh varchar2(500)) Spørgsmål 4.1 1 create or replace procedure insppraep(ppid praep.pid%type) as 2 cursor c1 is 3 select inavn from indholdpraep ip,indhold i where pid=ppid and ip.iid=i.iid; 4 v1 varchar2(500):=''; 5 v2 varchar2(500):='('; 6 BEGIN 7 delete from ppraep where pid=ppid; 8 select pnavn ' / ' vnavn into v1 9 from praep,virk 10 where praep.vid=virk.vid and pid=ppid and rownum<2; 11 FOR prec IN c1 LOOP 12 v2 := v2 prec.inavn ';'; 13 END LOOP; 14 v2 := v2 ')'; 15 insert into ppraep values(ppid,v1,v2); 16* END; Et script til kald af insppraep begin 2 insppraep(&nyt_pid); 3 end; 4 / Angiv værdien for nyt_pid: 5 gammel 2: insppraep(&nyt_pid); ny 2: insppraep(5); PL/SQL-procedure er udført. begin Spørgsmål 4.2

declare 2 cursor c2 is select pid from praep; 3 BEGIN 4 FOR praeprec IN c2 LOOP 5 insppraep(praeprec.pid); 6 --dbms_output.put_line(praeprec.pid 'aa'); 7 END LOOP; 8* END; Spørgsmål 4.3 Her kun en trigger på praep. Først en fejlaktig: 1 create or replace trigger ppraeptrig 2 after insert on praep 3 FOR EACH ROW 4 BEGIN 5 insppraep(:new.pid); 6* END; Trigger er oprettet. insert into praep(pid,pnavn) values (29999,'Vidundermikstur'); insert into praep(pid,pnavn) values (29999,'Vidundermikstur') * FEJL i linie 1: ORA-04091: tabellen TROELS.PRAEP muterer, trigger/funktion kan ikke læse den ORA-06512: ved "TROELS.INSPPRAEP", linje 8 ORA-06512: ved "TROELS.PPRAEPTRIG", linje 2 ORA-04088: fejl under udførelse af triggeren 'TROELS.PPRAEPTRIG' pga. ej-data-til-tiden besværligheder i oracle en after-trigger fortolkes som muterende. Derfor en before-trigger: ed 1 create or replace trigger ppraeptrig 2 before insert on praep 3 FOR EACH ROW 4 BEGIN 5 delete from ppraep where pid=:new.pid; 6 insert into ppraep(pid,besk) 7 select :new.pid,:new.pnavn ' / ' vnavn from virk where vid=:new.vid; 8* END; Trigger er oprettet. insert into praep(pid,pnavn,vid) values (29997,'Vidundermikstur',26);

1 række er oprettet. select * from ppraep; PID ---------- BESK -------------------------------------------------------------------------------- INDH -------------------------------------------------------------------------------- 29997 Vidundermikstur / Alpharma Spørgsmål 4.4 ed 1 select * from ppraep where pid in 2* (select pid from praep where pnavn like '%' '&1' '%') Angiv værdien for 1: reo gammel 2: (select pid from praep where pnavn like '%' '&1' '%') ny 2: (select pid from praep where pnavn like '%' 'reo' '%') PID ---------- BESK -------------------------------------------------------------------------------- INDH -------------------------------------------------------------------------------- 679 Treo / Lundbeck (Acetylsalicylsyre;Coffein;) 1454 Treosulfan "Medac" / Medac (Treosulfan;) 120 Pankreon / Solvay Pharma (Amylase;Lipase;Protease;)