Brauche Hilfe bei einer SQL Abfrage

Maledictus

FreeBSD ftw
Hi,

bin gerade an einer etwas schwierigeren SQL Abfrage, vielleicht weiss jemand von euch die Lösung.

Angenommen ich habe 2 Tabellen:
- Lieferungen mit den Spalten KundenNr und ArtikelNr
- Waren mit der Spalte ArtikelNr

Jetzt hätte ich gerne eine SQL Anweisung, die mir diejenigen KundenNr liefert, an die schonmal alle ArtikelNr geliefert worden sind. (Also eine Division in relationaler Algebra)

Danke im voraus
Male
 
Hi,

dieser Select sollte Dir alle Kunden liefern, die ALLE artikel bekommen haben.
(referentielle Integrität vorausgesetzt)

SELECT kundennr FROM (
SELECT kundennr, COUNT(artikelnr) AS anz
FROM lieferungen GROUP BY kundennr
) WHERE anz = (SELECT COUNT(*) FROM waren)

Gruß, Jobi
 
Hmm, ich glaube leider nicht. Und zwar in dem Fall, das ein Kunde einen Artikel garnicht bekommen hat, einen anderen dafür aber zwei mal...

/me denkt gerade über DISTINCT nach...
 
/me denkt gerade über DISTINCT nach...

Gute Idee...so müsste das doch gehen oder?

SELECT kundennr FROM (
SELECT kundennr, COUNT(DISTINCT(artikelnr)) AS anz
FROM lieferungen GROUP BY kundennr
) WHERE anz = (SELECT COUNT(*) FROM waren)
 
Also von dieser Anwendung von DISTINCT habe ich noch nicht gehört. Ich dachte eher an SELECT DISTINCT. Hast du Doku dazu? In der MySQL Doku finde ich nichts...
 
Hallo Maledistus,

in wie weit sich MySQL an den SQL99-Standard hält weiß ich nicht, aber lt. Standard ist folgendes möglich, um die gewünschte Ausgabe zu bekommen:
Code:
select distinct(kunde.kdnr), count(distinct(kunde.artnr)) from kunde 
group by kunde.kdnr 
having count(distinct(kunde.artnr)) = 
(select count(distinct(artikel.artnr)) from artikel)
Ich habe es unter PostgreSQL gerade eben auf Arbeit getestet und es funktioniert.

Aufbau der Tabellen:
kunde = (kdnr varchar(10), artnr varchar(10)) und artikel = (artnr varchar(10), ware varchar(100));
Das Statement kann man garantiert noch optimieren, aber...

Viele Grüße

Jürgen
 
Meiner Meinung nach geht das nur Schritt für Schritt zu lösen... SQL ist eine mengenorientierte Sprache, weswegen der Vergleich "X existiert für jedes Y" etwas schwierig ist...
Ich mach's jetz mal nur theoretisch, weil mir grad die Zeit fehlt.

Du brauchst 2 Mengen bestehend aus der Kombination KundenNr und ArtikelNr... eine Menge hast du schon: deine Lieferung-Tabelle - nur muss die begrenzt werden: keine Duplikate!

Die zweite Menge, die du brauchst ist einfach: jede ArtikelNr!

Nun gibt's aber wieder eine Hürde: wir wollen ja gerade NICHT die Schnittmenge haben, sondern etwas sehr spezielles: einen Vergleich! An dieser Stelle könnte eventuell wirklich die Aggregatfunktion count() helfen, da wir ja von eindeutigen Datensätzen ausgegangen sind... dort wo die count() aus beiden Mengen gleich sind hast du deinen Kunden...

Komplexe Sache aber wenn man sich Schritt für Schritt die beiden Anweisungen für beide Mengen zusammenbaut und die dann in einer Abfrage miteinander verschmilzt und gegenvergleicht könnte helfen das Problem zu lösen ;-)
 
Zurück
Oben