pn-schrauber
Goto Top

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:

a85f0834456c1201def961dc77169e45

Lieferant:

9cf3dc6c2c8bb695e16d1ebf2c0e4402

Artikel:

0c635261730b131be15de6ef738e5302



und Natürlich noch das ER-Modell

ea633e91ad4befedffe4e91d9f4e4bbf



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???

Content-Key: 268428

Url: https://administrator.de/contentid/268428

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: vBurak
vBurak 06.04.2015 aktualisiert um 11:56:55 Uhr
Goto Top
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 ;).
Mitglied: Biber
Biber 06.04.2015 aktualisiert um 17:00:02 Uhr
Goto Top
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:
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
Mitglied: PN-Schrauber
PN-Schrauber 06.04.2015 um 18:36:46 Uhr
Goto Top
Danke,

nun kann ich beruhigt Ferien machen die Woche :D
Mitglied: eisbein
eisbein 07.04.2015 aktualisiert um 20:08:53 Uhr
Goto Top
Hallo!

Bitte als "gelöst" kennzeichnen, wenn die Ferien dann vorbei sind face-wink

Gruß
Eisbein