Falk: SQL-Problem

Hallo Forum,

stehe im Moment voll auf der Leitung. Habe folgende Tabelle (Beispiel):

Bildnr.   Schlagwort
5         Kirche
8         Kunst
8         Kirche
12        Kirche
17        Kunst

Wie bekomme ich mit SQL die Datensätze mit gleicher Bildnummer? Sind natürlich
mehrere Einträge mit doppelter Bildnummer.

Danke
Falk

  1. Hi Falk,

    Wie bekomme ich mit SQL die Datensätze mit gleicher Bildnummer?
    Sind natürlich mehrere Einträge mit doppelter Bildnummer.

    das kommt ein wenig darauf an, was Du unter "mit SQL" verstehst.

    Ich würde das nach Möglichkeit mit einem subselect lösen wollen,
    was aber einige Datenbanken (u. a. mySQL) nicht können.

    Was hast Du denn so zur Verfügung?

    Viele Grüße
          Michael

    1. Hoi,

      Wie bekomme ich mit SQL die Datensätze mit gleicher Bildnummer?
      Sind natürlich mehrere Einträge mit doppelter Bildnummer.

      das kommt ein wenig darauf an, was Du unter "mit SQL" verstehst.

      Ich würde das nach Möglichkeit mit einem subselect lösen wollen,
      was aber einige Datenbanken (u. a. mySQL) nicht können.

      Ich glaube, hier ist die Fragestellung etwas unklar. Was meinst du mit
      'wie bekomme ich mit SQL die Datensaetze mit gleicher Bildnummer'?
      Willst du sie nach der Bildnummer sortiert haben? Oder willst du nur
      die Datensaetze, die doppelt vorkommen?

      Gruesse,
       CK

      1. Hallo,

        also ich hab eine Möglichkeit gefunden über zwei Unterabfragen.

        1. Select Bildnr, Schlagwort from tab where Schlagwort like "Kirche";
        2. Select Bildnr, Schlagwort from tab where Schlagwort like "Kunst";

        3. Select Abfrage2.Bildnr, Abfrage2.Schlagwort from Abfrage1, Abfrage2 where Abfrage1.Biildnr = Abfrage2.Bildnr;

        Das liefert mir alle Datensätze wo die Bildnummer doppelt ist. Allerdings ist mir noch nicht klar wie ich das in ein Statement packen kann.

        Ich benutze mysql. Habe die Abfragen aber unter Access ausprobiert.

        Falk

        1. Hoi,

          also ich hab eine Möglichkeit gefunden über zwei Unterabfragen.

          Pfui! ;-)

          1. Select Bildnr, Schlagwort from tab where Schlagwort like "Kirche";
          2. Select Bildnr, Schlagwort from tab where Schlagwort like "Kunst";
          1. Select Abfrage2.Bildnr, Abfrage2.Schlagwort from Abfrage1, Abfrage2 where Abfrage1.Biildnr = Abfrage2.Bildnr;

          Das liefert mir alle Datensätze wo die Bildnummer doppelt ist.
          Allerdings ist mir noch nicht klar wie ich das in ein Statement
          packen kann.

          Vielleicht so (ungetestet mangels RDBMS):

          SELECT
            b.bildnr,b.schlagwort
          FROM
            tab AS a
          LEFT JOIN
            tab AS b
          ON
            a.bildnr = b.bildnr
          WHERE (
            schlagwort
           LIKE
            "Kirche"
          OR
            schlagwort
           LIKE
            "Kunst")
          AND
            NOT ISNULL(b.bildnr)

          Wie gesagt, das ist ungetestet und duerfte wohl auch eine
          quadratische Performance-Einbusse bedeuten (== bei vielen n-fachen
          Eintraegen ganz wenig Performance).

          Gruesse,
           CK

          1. Hallo Christian,

            SELECT
              b.bildnr,b.schlagwort
            FROM
              tab AS a
            LEFT JOIN
              tab AS b
            ON
              a.bildnr = b.bildnr
            WHERE (
              schlagwort
            LIKE
              "Kirche"
            OR
              schlagwort
            LIKE
              "Kunst")
            AND
              NOT ISNULL(b.bildnr)

            klappt leider nicht. Mir werden alle Datensätze mit Kirche und alle mit Kunst angezeigt, praktisch ein Duplikat der Ausgangstabelle.

            Falk

            1. Hi Falk

              SELECT b.bildnr
                FROM tab AS a
                INNER JOIN tab AS b
                     ON (a.bildnr = b.bildnr
                         and b.schlagwort = 'Kirche')
                WHERE a.schlagwort = 'Kunst'

              Damit klappts hoffentlich (ungetestet mangels rdbms),
              ist allerdings keine allgemeine Lösung, klappt nur mit
              genau 2 (geändert auch mit mehreren, Performance würde
              jedoch massiv leiden).

              Wenn du eine alte Version von MySQL hast, dann
              geht INNER JOIN noch nicht, dann müsstest du mit
              LEFT (OUTER) JOIN arbeiten und die Records die
              auf der b Seite keine Einträge haben (ISNULL(b.bildnr))
              ausschliessen.

              Wenn es dir nur darum geht, Einträge die mehrfach existieren
              auszuschliessen kannst du damit arbeiten:

              SELECT a.bildnr, count(*) as counti
                FROM tab AS a
                WHERE (a.stichwort in ('stichwort1', 'stichwort2', ..., 'stichwortN')
                GROUP BY a.bildnr
                HAVING counti > entweder anz Stichworte, od anz min Treffer mit den Stichworten

              Gruss Daniela

              1. Hallo Daniela,

                SELECT b.bildnr
                  FROM tab AS a
                  INNER JOIN tab AS b
                       ON (a.bildnr = b.bildnr
                           and b.schlagwort = 'Kirche')
                  WHERE a.schlagwort = 'Kunst'

                Es funktioniert ! :-) in mysql und auch in access.
                Jetzt muß ichs nur noch verstehen :-)
                Vielen Dank.
                Falk

                1. Hi Falk

                  SELECT b.bildnr
                    FROM tab AS a
                    INNER JOIN tab AS b
                         ON (a.bildnr = b.bildnr
                             and b.schlagwort = 'Kirche')
                    WHERE a.schlagwort = 'Kunst'

                  Es funktioniert ! :-) in mysql und auch in access.
                  Jetzt muß ichs nur noch verstehen :-)

                  Er nimmt eine Zeile aus der Tabelle a und fügt
                  eine Zeile aus Tabelle b hinzu, und zwar jeweils
                  die Zeilen, wo beide bildnr identisch sind (die on-clause).

                  Daraus filtert er dann alle raus, wo das Schlagwort nicht
                  Kunst ist, das b.schlagwort könntest du auch noch zum
                  where runternehmen, also a... = 'Kunst' and b... = 'Kirche'.

                  Der inner join im Vergleich zum left join bedeutet, das
                  sowohl die linke Seite (also Tabelle a), als auch die rechte
                  Seite (Tabelle b) vorhanden sein muss, bei left join muss nur
                  die linke Seite (Tabelle a) ein Eintrag haben.

                  Natürlich macht er das ganze nicht in der Reihenfolge
                  und optimiert das ganze noch ein ganzes Stück.

                  Gruss Daniela

                  1. Hi Daniela,

                    ich glaub jetzt ist's klar. Das mit dem Schlagwort in der FROM Klausel hatte ich nicht kapiert.

                    Nochmals danke

                    Falk

            2. hi Falk,

              wie wärs mit

              SELECT DISTINCT *
              FROM tabelle
              WHERE bildnr IN (
                SELECT bildnr
                FROM tabelle
                WHERE COUNT (bildnr) > 2
                )

              ?? (habs nich getestet)

              Dein Onkel

              1. Hi Onkel

                SELECT DISTINCT *
                FROM tabelle
                WHERE bildnr IN (
                  SELECT bildnr
                  FROM tabelle
                  WHERE COUNT (bildnr) > 2
                  )

                Grundsätzlich mag das funktionieren (habs mir nicht weiter
                angeschaut), aber, er arbeitet mit MySQL und MySQL beherrscht
                keine Subselects. Deine Lösung läuft also nicht mit MySQL, in
                IN darf da nur eine Liste aus Werten sein, keine Query.

                Gruss Daniela

              2. Hi Onkel :-),

                SELECT DISTINCT *
                FROM tabelle
                WHERE bildnr IN (
                  SELECT bildnr
                  FROM tabelle
                  WHERE COUNT (bildnr) > 2
                  )

                geht leider nicht.
                Access z.B. bringt Fehler: Aggregatfunktion in WHERE-Klausel (COUNT(bildnr)>2)nicht möglich.

                Falk