Probleme beim Erstellen von ein paar Abfragen

werdas34

Benutzer
Beiträge
12
Hallo,

ich bin neu hier, deswegen kann es sein das der Thread verschoben werden musste. Arbeite mit SQL Developer.

Ich habe von der Uni paar Aufgaben bekommen, die ich lösen soll und bei ein paar komm ich nicht wirklich auf die Lösung:

1)
"Völlig trockene Biergärten": Die Namen der Biergärten, die keine alkoholischen Getränke ausschenken.
Code:
SELECT DISTINCT schenkt_aus.biergarten_name
FROM schenkt_aus, getraenk
WHERE schenkt_aus.getraenke_name = getraenk.gname
AND schenkt_aus.getraenke_name IN
    (SELECT getraenk.gname
    FROM getraenk
    WHERE alkogehalt = 0);
Im Subselect werden mir alle Getränke geliefert, die keinen Alkoholgehalt besitzen. Wie wende ich das dann auf die Biergärten an?


2)
"Absolut Neuenahr-feindliche Biergärten": Die Namen der Biergärten, die keine Getränke von Firmen aus Neuenahr ausschenken
Code:
select distinct schenkt_aus.biergarten_name
from schenkt_aus
join getraenk on schenkt_aus.getraenke_name = getraenk.gname
join firma on getraenk.hersteller = firma.fname
where firma.fname < all
    (select fname
    from firma
    where standort = 'Neuenahr');
Ich habe wie in 1) Probleme mit in, any, all, exists usw Probleme. Gibts da einen Trick oder Tipp bzw ne Schritt für Schritt Anleitungen um solche Aufgaben zu lösen?

3)
Seniorenförderung: Alle Biergärten, die von älteren Gästen besucht werden (Geburtsdatum vor 1.1.1945), erhalten so viele Plätze wie der größte in der Datenbank enthaltene Biergarten.
Code:
UPDATE biergarten
SET anzahlplaetze =
    (SELECT MAX(anzahlplaetze)
    FROM biergarten)
 JOIN besucht ON besucht.biergarten_name = biergarten.bname AND besucht.biergarten_ort = biergarten.ort
 JOIN gast ON gast.vname = besucht.besucher_vname AND gast.nname = besucht.besucher_nname
 WHERE gast.gebdatum <= TO_DATE('1945-01-01', 'yyyy-mm-dd');
Ich weiß, syntaktisch ist da der Wurm drin. Aber ich werde im Internet nicht ganz schlau wie man ein Update über mehrere Tabellen macht. Überall stehts ein bisschen anders drin und bei mir funktioniert keine.


4)
Firmensterben: Alle Firmen ohne Lieblingsgetränk machen zu.
Da ist mein Problem, das ich nicht weiß, ob man mehrere DELETE in einem Aufruf schreiben kann oder alles einzeln machen muss.

Denn in diesem Fall müsste man erst in schenkt_aus, dann in getraenke und dann zuletzt firma die entsprechenden Tupel löschen.
Mach ich zuerst;
Code:
delete from schenkt_aus 
where ...

delete from getraenke
where...

delete from firma
where ...
Oder kann man das irgendwie schachteln?

Hier mal die Tabellendefinitionen:
Code:
create table firma (
   fname char(20),
   standort char(20),
   primary key (fname)
);

create table getraenk (
   gname char(20),
   alkogehalt int,
   preisproliter decimal(4,2),
   hersteller char(20) not null,
   produktionsaufname date,
   primary key (gname),
   foreign key (hersteller) references firma
);

create table gast (
   nname char(20),
   vname char(20),
   gebdatum date,
   lieblingsgetraenk char(20),
   primary key (nname, vname),
   foreign key (lieblingsgetraenk) references getraenk
);

create table biergarten (
   bname char(20),
   ort char(20),
   eroeffdatum date,
   anzahlplaetze int,
   umsatzprojahr decimal (8,2),
   primary key (bname, ort)
);


create table besucht (
   besucher_nname char(20),
   besucher_vname char(20),
   biergarten_name char(20),
   biergarten_ort char(20),
   primary key (besucher_nname, besucher_vname, biergarten_name, biergarten_ort),
   foreign key (besucher_nname, besucher_vname) references gast,
   foreign key (biergarten_name, biergarten_ort) references biergarten
);

create table schenkt_aus (
   biergarten_name char(20),
   biergarten_ort char(20),
   getraenke_name char(20),
   ausschankprotag int,
   primary key (biergarten_name, biergarten_ort, getraenke_name),
   foreign key (biergarten_name, biergarten_ort) references biergarten,
   foreign key (getraenke_name) references getraenk
);

Ich bedanke mich schon im Vorraus für hilfreiche Antworten.
mfg werdas34
 
Werbung:
Oracle unterstützt kein JOIN im UPDATE.

Du musst das mit einem Sub-Query machen:
Code:
UPDATE biergarten
  SET anzahlplaetze = (SELECT MAX(anzahlplaetze) FROM biergarten)
where (bname,ort) in (select bt.biergarten_name, bt.biergarten_ort
                      FROM besucht bt
                       JOIN gast g ON g.vname = bt.besucher_vname AND g.nname = bt.besucher_nname
                      WHERE g.gebdatum <= TO_DATE('1945-01-01', 'yyyy-mm-dd'));

char() ist übrigens eine ganz, ganz schlechte Wahl für den Datentyp einer Spalte. Den solltest Du ganz schnell wieder vergessen. Wenn Du Strings ("Character") speichern willst, nimm VARCHAR (bzw. VARCHAR2).

Ich persönlich verwende übrigens lieber DATE '1945-01-01' (anstatt TO_DATE('1945-01-01', 'yyyy-mm-dd')) um ein konstantes Datum anzugeben. Da muss man weniger tippen und hat den Vorteil, dass es SQL Standard ist und damit auch portabel zu anderen Datenbanksystemen.
 
Vielen Dank.
Die Datensätze folgen im nächsten Post.
In der Uni wird Postgres empfohlen, nur habe ich früher mal bisschen mit SQL Developer gearbeitet und dachte auch das SQL gleich SQL ist. Naja so schnell täuscht man sich.
Wäre es sinnvoller auf Postgres umzusteigen, vorallem da das nächste Thema embedded SQL ist? Gibts dann dazu ein gutes Video/Anleitung wie man damit startet. Denn wir haben nur ne Liste mit Commands bekommen wie man Sachen ausführt? Meine Kommilitonen haben schon lange gebraucht um das zum laufen zu bekommen.
Ich würde sofern es geht, die paar Aufgaben dann noch mit SQL Developer lösen, da ich nicht weiß ob dann die anderen Querys noch funktionieren.

Das habe ich gemerkt. Und ich glaube Acces unterstützt dann Join. Dachte SQL ist wie Java eine Sprache und SQL Developer/Postgres/Acces sind die Entwicklungsumgebungen dazu.

Gut zu wissen mit dem Subquery. Hätte wahrscheinlich länger gedauert darauf zu kommen.

char() ist wahrscheinlich für Postgres optimiert. :D

Das mit TO_DATE habe ich hinzugefügt. Das lässt sich dann problemlos ändern.

Vielen Dank.
 
Datensatz:
Code:
insert into firma values ('Coca-Cola', 'Atlanta');
insert into firma values ('Gerolsteiner', 'Neuenahr');
insert into firma values ('Adelholzner', 'Griesbach');
insert into firma values ('Wittmann', 'Geisenhausen');
insert into firma values ('Pepsi', 'New York');

insert into getraenk values ('Fanta', 0, 3.20, 'Coca-Cola', TO_DATE('1894-01-01','yyyy-mm-dd'));
insert into getraenk values ('Mineralwasser pur', 0, 1.60, 'Gerolsteiner', TO_DATE('1952-12-21','yyyy-mm-dd'));
insert into getraenk values ('Zitrolimo', 0, 1.95, 'Adelholzner', TO_DATE('1955-02-24','yyyy-mm-dd'));
insert into getraenk values ('Pils', 5, 2.30, 'Wittmann', TO_DATE('1923-11-11','yyyy-mm-dd'));
insert into getraenk values ('Radler', 1, 2.10, 'Wittmann', TO_DATE('1974-01-01','yyyy-mm-dd'));

insert into getraenk values ('Sprite', 0, 3.10, 'Coca-Cola', TO_DATE('1961-01-01','yyyy-mm-dd'));
insert into getraenk values ('Mineralwasser orange', 0, 1.65, 'Gerolsteiner', TO_DATE('1977-03-04','yyyy-mm-dd'));
insert into getraenk values ('Lauwasser', 0, 0.99, 'Adelholzner', TO_DATE('1999-10-25','yyyy-mm-dd'));
insert into getraenk values ('Koelsch', 6, 2.55, 'Wittmann', TO_DATE('1967-07-01','yyyy-mm-dd'));
insert into getraenk values ('Pepsi', 0, 3.10, 'Pepsi', TO_DATE('1922-02-03','yyyy-mm-dd'));

insert into getraenk values ('Sinalco', 0, 2.10, 'Coca-Cola', TO_DATE('1955-01-01','yyyy-mm-dd'));
insert into getraenk values ('Mineralwasser zitro', 0, 1.75, 'Gerolsteiner', TO_DATE('1978-04-15','yyyy-mm-dd'));
insert into getraenk values ('Starkwasser', 0, 1.09, 'Adelholzner', TO_DATE('1999-10-25','yyyy-mm-dd'));
insert into getraenk values ('Malz', 2, 2.65, 'Wittmann', TO_DATE('1978-08-01','yyyy-mm-dd'));
insert into getraenk values ('Cola', 0, 3.30, 'Coca-Cola', TO_DATE('1899-04-23','yyyy-mm-dd'));

insert into gast values ('Leiner', 'Marc', TO_DATE('1986-04-13','yyyy-mm-dd'), 'Lauwasser');
insert into gast values ('Galois', 'Ephariste', TO_DATE('1725-12-12','yyyy-mm-dd'), 'Pils');
insert into gast values ('Barker', 'Jenny', TO_DATE('2000-12-01','yyyy-mm-dd'), 'Zitrolimo');
insert into gast values ('Zettler', 'Alois', TO_DATE('1965-09-08','yyyy-mm-dd'), 'Fanta');

insert into gast values ('Malzahn', 'Ulrike', TO_DATE('1985-11-13','yyyy-mm-dd'), 'Koelsch');
insert into gast values ('Geyer', 'Eduard', TO_DATE('1965-10-15','yyyy-mm-dd'), 'Malz');
insert into gast values ('Bonnie', 'Prince', TO_DATE('1999-07-11','yyyy-mm-dd'), 'Sprite');
insert into gast values ('Ypsilanti', 'Ena', TO_DATE('1944-09-17','yyyy-mm-dd'), 'Lauwasser');

insert into gast values ('Meier', 'Moritz', TO_DATE('1954-12-22','yyyy-mm-dd'), 'Lauwasser');
insert into gast values ('Huber', 'Eva', TO_DATE('1999-02-07','yyyy-mm-dd'), 'Pils');
insert into gast values ('Becker', 'Jimmy', TO_DATE('1987-12-04','yyyy-mm-dd'), 'Zitrolimo');
insert into gast values ('Zander', 'Andi', TO_DATE('1934-05-23','yyyy-mm-dd'), 'Fanta');

insert into gast values ('Petronius', 'Udo', TO_DATE('1966-02-24','yyyy-mm-dd'), 'Koelsch');
insert into gast values ('Trotzki', 'Lewin', TO_DATE('1954-06-30','yyyy-mm-dd'), 'Malz');
insert into gast values ('Yehudin', 'Peter', TO_DATE('1978-06-22','yyyy-mm-dd'), 'Sprite');
insert into gast values ('Lammers', 'Elena', TO_DATE('1953-08-03','yyyy-mm-dd'), 'Lauwasser');

insert into gast values ('Kobian', 'Lew', TO_DATE('1977-08-31','yyyy-mm-dd'), 'Cola');
insert into gast values ('Lennox', 'Arthur', TO_DATE('1988-05-11','yyyy-mm-dd'), 'Pepsi');

insert into biergarten values ('Das Fass', 'Geisenhausen', TO_DATE('2004-01-01','yyyy-mm-dd'), 150, 5000.00);
insert into biergarten values ('Die Taufe', 'Adlkofen', TO_DATE('2003-02-05','yyyy-mm-dd'), 75, 53000.00);
insert into biergarten values ('Zur letzten Instanz', 'Vilsbiburg', TO_DATE('2001-05-01','yyyy-mm-dd'), 230, 25000.00);
insert into biergarten values ('Mayflower', 'Landshut', TO_DATE('2000-07-15','yyyy-mm-dd'), 498, 34000.00);
insert into biergarten values ('Tollemogei', 'Geisenhausen', TO_DATE('2002-11-30','yyyy-mm-dd'), 124, 100000.00);
insert into biergarten values ('Entenrennen', 'Velden', TO_DATE('1999-03-04','yyyy-mm-dd'), 111, 3500.00);
insert into biergarten values ('Fimstuben', 'Geisenhausen', TO_DATE('1991-01-15','yyyy-mm-dd'), 200, 76000.00);
insert into biergarten values ('Helmbrunnen', 'Landshut', TO_DATE('2014-11-01','yyyy-mm-dd'), 560, 99000.00);

insert into besucht values ('Huber', 'Eva', 'Das Fass', 'Geisenhausen');
insert into besucht values ('Huber', 'Eva', 'Mayflower', 'Landshut');
insert into besucht values ('Huber', 'Eva', 'Helmbrunnen', 'Landshut');

insert into besucht values ('Meier', 'Moritz', 'Das Fass', 'Geisenhausen');
insert into besucht values ('Meier', 'Moritz', 'Mayflower', 'Landshut');
insert into besucht values ('Meier', 'Moritz', 'Fimstuben', 'Geisenhausen');

insert into besucht values ('Leiner', 'Marc', 'Die Taufe', 'Adlkofen');
insert into besucht values ('Leiner', 'Marc', 'Zur letzten Instanz', 'Vilsbiburg');
insert into besucht values ('Leiner', 'Marc', 'Tollemogei', 'Geisenhausen');

insert into besucht values ('Becker', 'Jimmy', 'Entenrennen', 'Velden');
insert into besucht values ('Becker', 'Jimmy', 'Das Fass', 'Geisenhausen');
insert into besucht values ('Becker', 'Jimmy', 'Mayflower', 'Landshut');
insert into besucht values ('Becker', 'Jimmy', 'Die Taufe', 'Adlkofen');

insert into besucht values ('Zettler', 'Alois', 'Mayflower', 'Landshut');
insert into besucht values ('Zettler', 'Alois', 'Helmbrunnen', 'Landshut');

insert into besucht values ('Malzahn', 'Ulrike', 'Zur letzten Instanz', 'Vilsbiburg');
insert into besucht values ('Malzahn', 'Ulrike', 'Mayflower', 'Landshut');
insert into besucht values ('Malzahn', 'Ulrike', 'Tollemogei', 'Geisenhausen');

insert into besucht values ('Geyer', 'Eduard', 'Die Taufe', 'Adlkofen');
insert into besucht values ('Geyer', 'Eduard', 'Entenrennen', 'Velden');

insert into besucht values ('Trotzki', 'Lewin', 'Mayflower', 'Landshut');
insert into besucht values ('Trotzki', 'Lewin', 'Das Fass', 'Geisenhausen');
insert into besucht values ('Trotzki', 'Lewin', 'Die Taufe', 'Adlkofen');
insert into besucht values ('Trotzki', 'Lewin', 'Tollemogei', 'Geisenhausen');
insert into besucht values ('Trotzki', 'Lewin', 'Zur letzten Instanz', 'Vilsbiburg');
insert into besucht values ('Trotzki', 'Lewin', 'Helmbrunnen', 'Landshut');

insert into besucht values ('Bonnie', 'Prince', 'Das Fass', 'Geisenhausen');
insert into besucht values ('Bonnie', 'Prince', 'Zur letzten Instanz', 'Vilsbiburg');
insert into besucht values ('Bonnie', 'Prince', 'Entenrennen', 'Velden');
insert into besucht values ('Bonnie', 'Prince', 'Fimstuben', 'Geisenhausen');

insert into besucht values ('Zander', 'Andi', 'Die Taufe', 'Adlkofen');
insert into besucht values ('Zander', 'Andi', 'Das Fass', 'Geisenhausen');
insert into besucht values ('Zander', 'Andi', 'Entenrennen', 'Velden');
insert into besucht values ('Zander', 'Andi', 'Fimstuben', 'Geisenhausen');

insert into schenkt_aus values ('Das Fass', 'Geisenhausen', 'Lauwasser', 3000);
insert into schenkt_aus values ('Das Fass', 'Geisenhausen', 'Fanta', 2500);
insert into schenkt_aus values ('Die Taufe', 'Adlkofen', 'Koelsch', 330);
insert into schenkt_aus values ('Die Taufe', 'Adlkofen', 'Sprite', 120);
insert into schenkt_aus values ('Die Taufe', 'Adlkofen', 'Fanta', 460);
insert into schenkt_aus values ('Die Taufe', 'Adlkofen', 'Zitrolimo', 990);
insert into schenkt_aus values ('Zur letzten Instanz', 'Vilsbiburg', 'Fanta', 1020);
insert into schenkt_aus values ('Zur letzten Instanz', 'Vilsbiburg', 'Starkwasser', 390);
insert into schenkt_aus values ('Zur letzten Instanz', 'Vilsbiburg', 'Pils', 850);
insert into schenkt_aus values ('Zur letzten Instanz', 'Vilsbiburg', 'Malz', 740);
insert into schenkt_aus values ('Zur letzten Instanz', 'Vilsbiburg', 'Mineralwasser pur',20);
insert into schenkt_aus values ('Zur letzten Instanz', 'Vilsbiburg', 'Koelsch', 100);
insert into schenkt_aus values ('Zur letzten Instanz', 'Vilsbiburg', 'Sprite', 350);
insert into schenkt_aus values ('Mayflower', 'Landshut', 'Fanta', 2000);
insert into schenkt_aus values ('Mayflower', 'Landshut', 'Pils', 340);
insert into schenkt_aus values ('Mayflower', 'Landshut', 'Malz', 770);
insert into schenkt_aus values ('Mayflower', 'Landshut', 'Lauwasser', 660);
insert into schenkt_aus values ('Mayflower', 'Landshut', 'Sinalco', 390);
insert into schenkt_aus values ('Tollemogei', 'Geisenhausen', 'Koelsch', 3000);
insert into schenkt_aus values ('Tollemogei', 'Geisenhausen', 'Pils', 5000);
insert into schenkt_aus values ('Entenrennen', 'Velden', 'Fanta', 1020);
insert into schenkt_aus values ('Entenrennen', 'Velden', 'Mineralwasser pur', 390);
insert into schenkt_aus values ('Entenrennen', 'Velden', 'Lauwasser', 850);
insert into schenkt_aus values ('Entenrennen', 'Velden', 'Starkwasser', 740);
insert into schenkt_aus values ('Entenrennen', 'Velden', 'Zitrolimo',20);
insert into schenkt_aus values ('Entenrennen', 'Velden', 'Sprite', 100);
insert into schenkt_aus values ('Entenrennen', 'Velden', 'Sinalco', 350);
insert into schenkt_aus values ('Helmbrunnen', 'Landshut', 'Pils', 200);
insert into schenkt_aus values ('Helmbrunnen', 'Landshut', 'Fanta', 760);
insert into schenkt_aus values ('Helmbrunnen', 'Landshut', 'Radler', 125);
insert into schenkt_aus values ('Helmbrunnen', 'Landshut', 'Zitrolimo', 340);
insert into schenkt_aus values ('Fimstuben', 'Geisenhausen', 'Koelsch', 230);
insert into schenkt_aus values ('Fimstuben', 'Geisenhausen', 'Lauwasser', 100);
insert into schenkt_aus values ('Fimstuben', 'Geisenhausen', 'Sinalco', 230);
insert into schenkt_aus values ('Fimstuben', 'Geisenhausen', 'Cola', 230);
 
Wäre es sinnvoller auf Postgres umzusteigen, vorallem da das nächste Thema embedded SQL ist?
Definitiv. Wenn ihr an der Uni Postgres verwendet, dann solltest Du das auch. Trotz des "SQL Standards" unterscheiden sich die einzelnen Datenbanksystem in den Details dann doch - teilweise sehr stark.

char() ist wahrscheinlich für Postgres optimiert.

Nein, CHAR is auch in Postgres keine gute Idee. Vergiss einfach dass es den Datentyp gibt.
 
also, um mal eine Lösung mit PostgreSQL zu Frage 1 zu zeigen:

Code:
test=*# select
  biergarten_name || ' in ' || biergarten_ort
from
  schenkt_aus
group by 1
having
  array_agg(trim(getraenke_name)) && (
    select array_agg(trim(gname)) from getraenk where alkogehalt > 0
  );
             ?column?             
-----------------------------------
 Fimstuben in Geisenhausen
 Tollemogei in Geisenhausen
 Mayflower in Landshut
 Helmbrunnen in Landshut
 Die Taufe in Adlkofen
 Zur letzten Instanz in Vilsbiburg
(6 rows)

test=*#

Was mache ich da? Ich bilde ARRAY's, welche Getränke in welchem Biergaten es gibt und eines, welche alkoholischen Getränke es gibt, und schaue, wo sich diese Array's überlappen.
 
und für die zweite Frage:

Code:
test=*# with Neuenahr as (
  select
    array_agg(trim(gname))
  from getraenk
  where hersteller in (select fname from firma where standort = 'Neuenahr'))

select
  biergarten_name || ' in ' || biergarten_ort nix_aus_neuenahr
from
  schenkt_aus
group by 1
having not
  array_agg(trim(getraenke_name)) && (select * from Neuenahr);
      nix_aus_neuenahr     
----------------------------
 Fimstuben in Geisenhausen
 Das Fass in Geisenhausen
 Tollemogei in Geisenhausen
 Mayflower in Landshut
 Helmbrunnen in Landshut
 Die Taufe in Adlkofen
(6 rows)

test=*#

Arrays wie schon zuvor, und noch CTE-Anwendung.
 
Definitiv. Wenn ihr an der Uni Postgres verwendet, dann solltest Du das auch. Trotz des "SQL Standards" unterscheiden sich die einzelnen Datenbanksystem in den Details dann doch - teilweise sehr stark..
Ok. ich beschäftige mich am Wochenende mehr mit Postgres.
Ich muss dazu erwähnen, dass wir nur die SQL Standards durchgenommen haben und nichts speziell was nur Postgres bietet.

Da kommen wir auch zu @akretschmer.
Vielen Dank für deine Lösungsvorschläge, jedoch schießen sie über unseren Wissenstands weit hinaus.

Wir hatten bisjetzt die typischen Dinge, die man gebrauchen kann für eine Abfrage(having, group by, join, ...). Dazu dann die elementaren Aggregationsfunktionen(avg, sum, count, ...) und die Quantoren(in, exists, all, any, ...).
Klar es führen mehrere Wege nach Rom, aber diese Sachen sind halt prüfungsrelevant.

Nun noch ne Frage zu Postgres. Ich habe ihn auf Windows installiert. Und weiß wie man mit pgAdmin 4, Datenbanken, Tabellen und deren Spalten erstellt.
Ich möchte aber nicht alles mit der Hand neu eintippen. Habe eine .sql Datei und dort stehen die Tabellendefinitionen und die inserts drinnen. Kann man die Datei importieren?

Und bei mir in der Postgres-Nutzung-Empfehlung steht drinnen, dass man die Querys über das Shell ausführen soll.
Was ist sinnvoller?
 
Werbung:
Nun noch ne Frage zu Postgres. Ich habe ihn auf Windows installiert. Und weiß wie man mit pgAdmin 4, Datenbanken, Tabellen und deren Spalten erstellt.
Ich möchte aber nicht alles mit der Hand neu eintippen. Habe eine .sql Datei und dort stehen die Tabellendefinitionen und die inserts drinnen. Kann man die Datei importieren?
Sicher. Ich nutze es nur nicht. Aber: Query-tool, Datei, Öffne. Datei auswählen. Ausführen.

Und bei mir in der Postgres-Nutzung-Empfehlung steht drinnen, dass man die Querys über das Shell ausführen soll.
Was ist sinnvoller?

Ich nutze nur psql, also das Command Line Tool.
 
Zurück
Oben