SQL-Abfrage für Anfänger, brauch hilfe bei der Lösung
Hallo und frohe Ostern,
Ich bin in einer Umschulung zum Fachinformatiker und wir haben gerade den SQL-Kurs, leider haben wir einen Dozenten der uns gern quält, so haben wir am Donnerstag noch 26 Aufgaben bekommen und sollten diese lösen. Nur haben wir jetzt eine Woche Urlaub.
soweit habe ich auch alle lösen können, bis auf eine, und die macht mich wahnsinnig zur Zeit, evenetuell hat ja wer von euch die passenden Idee für mich
unsere Tabellen sind folgende
Lieferung:

Lieferant:

Artikel:

und Natürlich noch das ER-Modell
Nun zur Frage:
Durch welche Abfrage erhält man aus der Datenbank "Standard" (oben aufgeführte), Nummern aller Lieferanten, welche die gleichen Artikel wie Lieferant "L02" gelifert haben?
auf Nachfrage, sagte der Dozent, es dürfen ur die erscheinen, die genau das haben was L02 geliefert hat, sprich auch nicht die die mehr geliefert haben.
ich bin ja schon soweite, dass ich alle bekomme die das geliefert haben was L02 geliefert hat
select lnr
from Lieferung
where anr in (select anr
from lieferung
where lnr = 'L02')
und alle die etwas geliefert haben was L02 nicht geliefert hat
select distinct lnr
from Lieferung
where anr in (select distinct anr
from lieferung
where lnr = 'L02)
nun bekomm ich die Verbindung aber nicht hin, ich bekomme immer eine leere Tabelle
wenn ih zum Bespiel folgendes versuche
select lnr, anr
from Lieferung
where anr in (select anr
from lieferung
where lnr = 'L02')
and lnr not in
(select distinct lnr
from Lieferung
where anr in (select distinct anr
from lieferung
where lnr in ('L02')))
meine Mitschülerin hat folgende Abfrage geschrieben
select c.lnr
from (select count(a.lnr) as [anz], a.lnr from lieferung as a
where a.anr in (select b.anr
from lieferung as b
where b.lnr='L02') group by a.lnr) as c
where anz = (select count(distinct d.anr) from lieferung as d
where d.lnr='L02') and exists (select count(distinct e.anr) as [anz_anr], e.lnr
from lieferung as e group by e.lnr) intersect select f.lnr
from (select count(g.lnr) as [anz], g.lnr from lieferung as g
group by g.lnr) as f
where anz = (select count(distinct i.anr)
from lieferung as i where i.lnr='L02') and exists (select count(distinct j.anr) as [anz_anr], j.lnr
from lieferung as j group by j.lnr);
aber es geht sicher auch anders, oder???
Ich bin in einer Umschulung zum Fachinformatiker und wir haben gerade den SQL-Kurs, leider haben wir einen Dozenten der uns gern quält, so haben wir am Donnerstag noch 26 Aufgaben bekommen und sollten diese lösen. Nur haben wir jetzt eine Woche Urlaub.
soweit habe ich auch alle lösen können, bis auf eine, und die macht mich wahnsinnig zur Zeit, evenetuell hat ja wer von euch die passenden Idee für mich
unsere Tabellen sind folgende
Lieferung:

Lieferant:

Artikel:

und Natürlich noch das ER-Modell
Nun zur Frage:
Durch welche Abfrage erhält man aus der Datenbank "Standard" (oben aufgeführte), Nummern aller Lieferanten, welche die gleichen Artikel wie Lieferant "L02" gelifert haben?
auf Nachfrage, sagte der Dozent, es dürfen ur die erscheinen, die genau das haben was L02 geliefert hat, sprich auch nicht die die mehr geliefert haben.
ich bin ja schon soweite, dass ich alle bekomme die das geliefert haben was L02 geliefert hat
select lnr
from Lieferung
where anr in (select anr
from lieferung
where lnr = 'L02')
und alle die etwas geliefert haben was L02 nicht geliefert hat
select distinct lnr
from Lieferung
where anr in (select distinct anr
from lieferung
where lnr = 'L02)
nun bekomm ich die Verbindung aber nicht hin, ich bekomme immer eine leere Tabelle
wenn ih zum Bespiel folgendes versuche
select lnr, anr
from Lieferung
where anr in (select anr
from lieferung
where lnr = 'L02')
and lnr not in
(select distinct lnr
from Lieferung
where anr in (select distinct anr
from lieferung
where lnr in ('L02')))
meine Mitschülerin hat folgende Abfrage geschrieben
select c.lnr
from (select count(a.lnr) as [anz], a.lnr from lieferung as a
where a.anr in (select b.anr
from lieferung as b
where b.lnr='L02') group by a.lnr) as c
where anz = (select count(distinct d.anr) from lieferung as d
where d.lnr='L02') and exists (select count(distinct e.anr) as [anz_anr], e.lnr
from lieferung as e group by e.lnr) intersect select f.lnr
from (select count(g.lnr) as [anz], g.lnr from lieferung as g
group by g.lnr) as f
where anz = (select count(distinct i.anr)
from lieferung as i where i.lnr='L02') and exists (select count(distinct j.anr) as [anz_anr], j.lnr
from lieferung as j group by j.lnr);
aber es geht sicher auch anders, oder???
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 268428
Url: https://administrator.de/forum/sql-abfrage-fuer-anfaenger-brauch-hilfe-bei-der-loesung-268428.html
Ausgedruckt am: 10.04.2025 um 23:04 Uhr
4 Kommentare
Neuester Kommentar
Hallo,
ich habe länger kein SQL mehr gemacht.
probier mal ein INTERSECT/MINUS auf deinen beiden einzelnen Abfragen.
Ansonsten hilft dir vielleicht das weiter:
SELECT lnr, anr FROM Lieferung INNER JOIN (SELECT anr, lnr FROM Lieferung WHERE lnr = 'L02') DT ON Lieferung.anr = DT.anr GROUP BY lnr;
Funktioniert die Lösung deiner Mitschülerin? Sieht ein bisschen heftig aus für die "einfache" Abfrage. Aber eigentlich sollten immer mehrere Wege nach Rom führen ;).
ich habe länger kein SQL mehr gemacht.
probier mal ein INTERSECT/MINUS auf deinen beiden einzelnen Abfragen.
Ansonsten hilft dir vielleicht das weiter:
SELECT lnr, anr FROM Lieferung INNER JOIN (SELECT anr, lnr FROM Lieferung WHERE lnr = 'L02') DT ON Lieferung.anr = DT.anr GROUP BY lnr;
Funktioniert die Lösung deiner Mitschülerin? Sieht ein bisschen heftig aus für die "einfache" Abfrage. Aber eigentlich sollten immer mehrere Wege nach Rom führen ;).
Moin PN-Schrauber,
willkommen im Forum.
Danke dafür, dass du deine Frage so sorgfältig ausgearbeitet hast - von der Haarfarbe deiner Mitschülerin abgesehen ist jedes wesentliche Detail dabei.
Ist wirklich vorbildlich und selten und sollte deshalb auch lobend erwähnt werden.
Zu deiner Abfrage:
Eigentlich gehst du den richtigen Weg mit der Kombination der beiden Abfragen.
Allerdings muss auch ein leeres Resultset, also "kein Treffer" herauskommen, denn es gibt in den Beispieldaten keinen weiteren Lieferanten, der die gleichen Artikel und nur die gleichen Artikel wie Lieferant L02 im Programm hat.
Es führen ja zig Variationen zum Ziel und ich hätte es vermutlich in dieser Art gelöst:
Aber auch diese Variante würde - bei deinen geposteten Beispieldaten einen leeren Resultset zurückliefern.
Andere Variationen mit JOIN/WHERE EXISTS/ INTERSECT aber genauso.
Mach die Gegenprobe:
Wenn du in den Beispieldaten "Lieferungen" einen Datensatz ergänzt dahingehend, dass Lieferant L02 auch den Artikel A04 liefert (dann hätten L02 und L03 dasselbe Sortiment), dann würde deine Abfrage auch "L03" zurückliefern.
Grüße
Biber
willkommen im Forum.
Danke dafür, dass du deine Frage so sorgfältig ausgearbeitet hast - von der Haarfarbe deiner Mitschülerin abgesehen ist jedes wesentliche Detail dabei.
Ist wirklich vorbildlich und selten und sollte deshalb auch lobend erwähnt werden.
Zu deiner Abfrage:
Eigentlich gehst du den richtigen Weg mit der Kombination der beiden Abfragen.
Allerdings muss auch ein leeres Resultset, also "kein Treffer" herauskommen, denn es gibt in den Beispieldaten keinen weiteren Lieferanten, der die gleichen Artikel und nur die gleichen Artikel wie Lieferant L02 im Programm hat.
Es führen ja zig Variationen zum Ziel und ich hätte es vermutlich in dieser Art gelöst:
Select distinct lnr from lieferung liefsame
where anr in (select distinct anr from lieferung where Lnr='L02')
and lnr <>'L02'
and lnr not in
(Select lnr from lieferung
where anr not in (select distinct anr from lieferung where Lnr='L02')
)
Aber auch diese Variante würde - bei deinen geposteten Beispieldaten einen leeren Resultset zurückliefern.
Andere Variationen mit JOIN/WHERE EXISTS/ INTERSECT aber genauso.
Mach die Gegenprobe:
Wenn du in den Beispieldaten "Lieferungen" einen Datensatz ergänzt dahingehend, dass Lieferant L02 auch den Artikel A04 liefert (dann hätten L02 und L03 dasselbe Sortiment), dann würde deine Abfrage auch "L03" zurückliefern.
Grüße
Biber