Announcement

Collapse
No announcement yet.

logisches SQL-Problem: Einträge ohne bestimmten Wert finden...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • logisches SQL-Problem: Einträge ohne bestimmten Wert finden...

    Hallo! Ich hab ein Hänger beim Denken. Folgendes Problem:
    Gegeben ist eine Tabelle mit doppeltem Schlüssel, nennen wir sie k1 und k2:
    Code:
     k1 | k2 
    ---------
    1   | 1   
    1   | 2   
    1   | 3   
    2   | 1   
    2   | 2   
    2   | 3
    Nun möchte ich alle k1 haben, die nicht in Kombination mit einem bestimmten k2-Wert (x) auftauchen.
    Folgendes Select löst diese Aufgabe:
    SELECT DISTINCT k1
    FROM tabelle
    WHERE k1 NOT IN
    (
    SELECT k1
    FROM tabelle
    WHERE k2 =x
    )
    Leider ist die Abfrage sehr ineffizient und die Tabelle verdammt groß.
    Es müsste doch was Schnelleres ohne geschachteltes Select-Statement geben, oder? Ich dachte an sowas wie nach k1 gruppieren und dann Gruppen ohne k2=x rausschmeißen. Hat jemand eine Idee???
    Danke für jede Anregung!

  • #2
    Hallo,

    wenn die Datenbank auf dem MS SQL Server 2005 läuft, kann EXCEPT verwendet werden. EXCEPT ermittelt die Differenzen, indem die Ergebnismenge der ersten Abfrage mit der Ergebnismenge der zweiten Abfrage verglichen wird. Das Endergebnis enthält nur die Datensätze, die nur in der ersten Ergebnismenge vorkommen:

    Code:
    USE tempdb
    GO
    
    CREATE TABLE TestTbl
    (
      k1  INT NOT NULL,
      k2  INT NOT NULL,
      v   INT NOT NULL DEFAULT 1
      CONSTRAINT pkTestTbl PRIMARY KEY CLUSTERED(k1,k2)
    )
    GO
    INSERT INTO TestTbl(k1,k2) VALUES (1,1)
    INSERT INTO TestTbl(k1,k2) VALUES (1,2)
    INSERT INTO TestTbl(k1,k2) VALUES (1,3)
    INSERT INTO TestTbl(k1,k2) VALUES (2,1)
    INSERT INTO TestTbl(k1,k2) VALUES (2,2)
    INSERT INTO TestTbl(k1,k2) VALUES (2,3)
    INSERT INTO TestTbl(k1,k2) VALUES (3,4)
    GO
    
    
    SELECT k1 FROM TestTbl
    EXCEPT
    SELECT k1 FROM TestTbl WHERE k2 = 4

    Comment


    • #3
      Leider (oder im Großen und Ganzen Gott-sei-Dank) benutze ich eine MySQL5-Datenbank, welche kein EXCEPT bietet.
      Sowei ich weiß, ist das "NOT IN" aus meinem Beispiel aber doch gleichwertig, insbesondere in der Arbeitsweise und damit in der Performanz, oder?

      Comment


      • #4
        Hallo Daniel,

        also als Alternative zum WHERE ... NOT IN ... kann ich dir noch WHERE NOT EXISTS ... anbieten. Also für dein Bsp.:
        [highlight=sql]
        SELECT DISTINCT k1
        FROM tabelle outer
        WHERE NOT EXISTS
        (
        SELECT 'X'
        FROM tabelle inner
        WHERE inner.k2 = x
        AND inner.k1 = outer.k1
        )
        [/highlight]
        Nach meiner Erfahrung ist das NOT EXISTS bei großen Datenmengen in Abhängigkeit vom Vorhandensein passender Indizes performanter.
        Ich weiß aber nicht genau inwieweit / wie gut NOT EXISTS von MySQL5 unterstützt wird.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo,

          ..benutze ich eine MySQL5-Datenbank, welche kein EXCEPT bietet.
          Tja - nicht ohne Grund sollte man bei der Frage schon genau angeben, für welchen SQL-Dialekt eine Antwort auf die Frage erwartet wird ;-)

          Comment


          • #6
            @ Frank Prüfer:
            Danke! (NOT) EXISTS wird von mySQL unterstützt. Ich werde damit erst mal arbeiten.

            @ Andreas Kosch:
            Hm, ja, ich hatte es vergessen...
            Allerdings ist das Problem doch eher logischer Natur; die entsprechenden Befehle zu finden (und ein Äquivalent zu einem nicht unterstützten Befehl habe ich bei MySQL bisher immer gefunden) ist dann halt etwas Google- oder Buch-Recherche...

            Comment

            Working...
            X