damned: HILFE SQL Tabellenvergleich

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

  1. 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

    1. 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

  2. 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.

    1. 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

      1. 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ß

        1. 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