HILFE SQL Tabellenvergleich
damned
- datenbank
Hallo zusammen,
Ich habe folgendes Problem, das ich lösen muss:
Ich habe zwei Tabellen, eine die aus zwei zusammengesetzt wird und eine Weitere aus der ich eine Spalte selektiere.
Die zweite Tabelle besteht nach der selektion nur aus einer Spalte und zwei Zeilen.
Ich möchte nun die erste Tabelle mit der zweiten Tabelle vergleichen und als Ergebnisse die Daten aus der ersten Tabelle haben, deren Werte auch in der Zweiten Tabelle vorkommen.
Tabelle a
Personen Saison
Müller w2002
Meyer w2002
Meyer w2003
Maria w2003
Dieter w2002
Tabelle b
Saison
w2002
w2003
Ergebnis
Meyer
weil er in beiden Saisons vorkommt
Viele Grüsse und danke
damned
yo,
Ich habe zwei Tabellen, eine die aus zwei zusammengesetzt wird und eine Weitere aus der ich eine Spalte selektiere.
Die zweite Tabelle besteht nach der selektion nur aus einer Spalte und zwei Zeilen.
also hier geht ein wenig durcheinander und ist verwirrend. eine selektion ist die filterung der datensätze (horizontale filterung). filtert man spalten aus, so ist das eine projektion (vertikale filterung).
und eine Tabelle bleibt eine tabelle, auch wenn sie spalten enthält, die sich auf mehrere andere tabellen beziehen. das ist dann meistens eines sogennante beziehungstabelle.
Ich möchte nun die erste Tabelle mit der zweiten Tabelle vergleichen und als Ergebnisse die Daten aus der ersten Tabelle haben, deren Werte auch in der Zweiten Tabelle vorkommen.
SELECT a.personen
FROM a
WHERE a.saison = ALL (SELECT DISTINCT b.saison FROM b);
dabei ist anzumerken, dass solche namen nicht eindeutig sind, also zwei personen den gleichen namen haben können. deshalb solltest du lieber über eine personen_id gehen.
Ilja
Danke an alle Ich hab die Lösung gefunden
SELECT Count(t1.saison) as anz, t1.personenFROM tabelle1 as t1GROUP BY t1.personenhaving Count(t1.saison)=(Select count(saison) from tabelle2);
noch mals danke
Hallo!
Ilja's Lösung hat bei mir unter Host-DB2 leider zu keinem Ergebnis geführt.
Habe es mit folgenden Beispieldaten
Saison: SAISON
W2002
W2003
Person: PERSON SAISON
ALPHA W2002 s
BETA S2002
CHARLIE W2003 s
DELTA S2002
DELTA W2002 s
ECHO W2002 s S
ECHO W2003 s S
FOXTROTT S2002
FOXTROTT W2003 s
GOLF S2002
GOLF W2002 s S
GOLF W2003 s S
Die mit dem kleinen 's' markierten Zeilen matchen beim Join, aber nur die mit großem 'S' markierten dürften relevant sein, weil beide vorhanden sein müssen, wenn ich die Frage richtig verstanden habe.
Dafür habe ich den folgenden SQL gebaut:
SELECT P.PERSON
FROM DB00070.PERSON_SAISON AS P
, DB00070.SAISON AS S
, (SELECT COUNT(*) ANZ_SAIS
FROM DB00070.SAISON ) AS Z
WHERE P.SAISON = S.SAISON
GROUP BY P.PERSON
, Z.ANZ_SAIS
HAVING COUNT(*) = Z.ANZ_SAIS
WITH UR;
Als Ergebnis kamen auch nur die Leute 'ECHO' und 'GOLF' heraus.
Stellt sich die Frage, ob 'GOLF', der außerdem noch die Saison 'S2002' hat, dabei sein darf.
yo,
Ilja's Lösung hat bei mir unter Host-DB2 leider zu keinem Ergebnis geführt.
stimmt, mein SELECT statement geht auch nicht.
SELECT a.personen, COUNT (*) AS 'Anzahl'
FROM a
GROUP BY a.person
HAVING COUNT (*) = (SELECT COUNT(*) FROM b);
sollte das nicht reichen ?
Ilja
SELECT a.personen, COUNT (*) AS 'Anzahl'
FROM a
GROUP BY a.person
HAVING COUNT (*) = (SELECT COUNT(*) FROM b);
sollte das nicht reichen ?
Ich fürchte nein.
Wenn ich das richtig sehe - hab's nicht ausprobiert - liefert der SQL bei meinen Beispieldaten zwar 'ECHO' und fälschlicherweise 'DELTA' und 'FOXTROTT' zurück, weil alle zwei Einträge haben. Die letzteren haben aber dummerweise die 'S2002' und es fehlt jeweils eine der beiden 'W'-Saisons.
Und 'GOLF' mit seinen drei Einträgen bleibt ganz auf der Strecke.
Gruß
yo,
Wenn ich das richtig sehe - hab's nicht ausprobiert - liefert der SQL bei meinen Beispieldaten zwar 'ECHO' und fälschlicherweise 'DELTA' und 'FOXTROTT' zurück, weil alle zwei Einträge haben.
jetzt muss ich aber mal nachfragen, ob deine beispieldaten dem orginal entsprechen oder nicht doch mehr hinein interpretiert wurde ? wenn man ein paar regeln beachtet, sollte der statement eigentlich laufen.
Ilja