Announcement

Collapse
No announcement yet.

IN-Abfrage mit mehreren Spalten

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

  • IN-Abfrage mit mehreren Spalten

    Hallo zusammen!

    Ist es möglich, eine IN-Abfrage mit mehreren Spalten zu erstellen? Also in etwa so:
    SELECT * FROM Tabelle WHERE (Spalte1, Spalte2) IN (SELECT Spalte1, Spalte2 FROM andereTabelle)
    Primärschlüssel ist also das Tupel (Spalte1, Spalte2).
    Leider wird bei einer so aufgebauten Abfrage die Fehlermeldung "Falscher Syntax..." ausgegeben.
    Kann jemand mir da weiterhelfen?

    Ralf

  • #2
    Hallo Ralf,

    offensichtlich wird das dann vom verwendeten DBMS nicht unterstützt. Evtl. kannst du die Abfrage umformulieren:
    [highlight=sql]
    SELECT * FROM Tabelle o
    WHERE exists (
    SELECT 'X' from andereTabelle i
    where i.Spalte1 = o.Spalte1
    AND i.Spalte2 = o.Spalte2)
    [/highlight]

    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


    • #3
      Hallo Ralf,

      Versuch mal diese Form:

      SELECT * FROM Tabelle WHERE Spalte1 + Spalte2 IN (SELECT Spalte1 + Spalte2 FROM Tabelle2)
      *-- robert.oh. --*

      Comment


      • #4
        Hallo Robert,

        das ist gefährlich, vor allem wenn Spalte1 und Spalte2 numerische Werte sind. Denn ein PK aus Spalte1=1 und Spalte2=2 würde hier auch mit Spalte1=2 und Spalte2=1 verknüpft werden. Auch eine alphanumerische Verkettung bringt so nichts, da '2' || '11' das gleiche Ergebniss besitzt wie '21' || '1'! Wenn mit solcherart Verkettung gearbeitet wird, dann müssen die Spalten sauber separiert werden, entweder durch ein eindeutiges Trennzeichen oder Verschieben der Wertebereiche.

        Gruß Falk
        Zuletzt editiert von gfoidl; 01.09.2012, 13:10.
        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
          Es sind ganzzahlige positive Werte in beiden Spalten. Kann man Trennzeichen einfügen (z. B. Spalte1 + "#" + Spalte2)?

          Ralf
          Zuletzt editiert von gfoidl; 01.09.2012, 13:10.

          Comment


          • #6
            Hallo Falk,

            Danke fuer die Info - ist natuerlich logisch, hab ich vergessen
            *-- robert.oh. --*

            Comment


            • #7
              Originally posted by Ralf Pongratz View Post
              Es sind ganzzahlige positive Werte in beiden Spalten. Kann man Trennzeichen einfügen (z. B. Spalte1 + "#" + Spalte2)?

              Ralf
              Sicher kann man das machen, aber wozu? Um diese Form zu realisieren mußt du
              • Sicherstellen das das Trennzeichen eindeutig ist (auch zukünftig)
              • Vier numerische Werte in Strings umwandeln
              • Vier Verkettungsoperationen ausführen
              • Auf die Nutzung von Indizes verzichten

              Was spricht gegen die Variante mit ... WHERE EXISTS ...?

              Falls du dich doch für die "Verkettung" entscheidest, dann würde ich numerisch bleiben. Statt Spalte1 + "#" + Spalte2 lieber Spalte1 * MaxMöglicherWertVonSpalte2 + Spalte2

              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


              • #8
                Originally posted by Falk Prüfer View Post
                [...]
                Was spricht gegen die Variante mit ... WHERE EXISTS ...?
                [...]
                Ich habe es mittlerweile auch mit WHERE EXISTS realisiert. Und da es funktioniert, werde ich es wohl auch beibehalten.

                Aber was mich noch interessieren würde: Wie sieht das mit der Schnelligkeit aus? Beide Tabellen sind (in etwa) gleich lang und werden recht bald >>10.000 Einträge haben.

                Die Variante der Stringverkettung hätte demnach eine lineare Komplexität O(2n): Die innere SELECT-Abfrage hat n Vergleiche und da sie jeweils maximal einen Datensatz zurückliefern, hat auch die äußere Abfrage nur n Vergleiche.
                Die WHERE-EXISTS-Variante hätte quadratische Komplexität O(n²): Die innere SELECT-Abfrage hat n² Vergleiche (jede Zeile mit jedem), die n Abfragen, ob ein Datensatz existiert, fallen nicht mehr ins Gewicht.

                Somit wäre, wenn die Umwandlung in Strings nicht zu aufwändig ist, die Stringverkettung bei größeren Datenmengen schneller (wenn auch vom Programmierstil nicht so toll ). Oder habe ich da einen Denkfehler gemacht?

                Viele Grüße, Ralf

                Comment


                • #9
                  Originally posted by Ralf Pongratz View Post
                  ...Somit wäre, wenn die Umwandlung in Strings nicht zu aufwändig ist, die Stringverkettung bei größeren Datenmengen schneller (wenn auch vom Programmierstil nicht so toll ). Oder habe ich da einen Denkfehler gemacht?
                  Das kann ich mir nicht vorstellen, entscheidend ist doch WIE der Server die DS findet. Bei der Stringverkettung kommt definitv ein FULL-Table-Scan über beide Tabellen heraus. Dazu kommen die Resourcen für die Stringumwandlung und Verkettung.
                  Bei der WHERE EXITS Lösung kann der Server zumindest für die Lokalisierung der DS in der inneren Abfrage evtl. vorhandene Indizes benutzen. Für die äußere Tabelle bleibt es beim FTS.
                  Aber pauschalisieren möchte ich es dennoch nicht, da keine Aussage über den verwendeten Server getroffen ist.

                  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

                  Working...
                  X