Announcement

Collapse
No announcement yet.

Balken vorm Kopf bei Select

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

  • Balken vorm Kopf bei Select

    Hallo zusammen,

    Zwei tabellen

    Tabelle1
    ID1



    Tabelle2
    ID1
    ID2

    Jetzt will ich die Datensätze der Tabelle1 Finden, die keinen Eintrag ID2 für Tabelle 2 haben???
    Also keine Datensätze in Tabelle2 nicht vorhanden sind.

    DatenSatz aus Tabelle1 steht für sich alleine....


    ?????

  • #2
    Select T1.ID
    from Tabelle1 T1
    where not(exists(select * from Tabelle2 T2 where T2.ID=T1.ID))
    group by T1.ID


    Kriege ein Ergebnis bin mir aber nicht sicher ob das so richtig ist und ob es sinnvoller geht?

    Comment


    • #3
      Hi,

      ist schon OK. Allerdings ist die eine Klammer überflüssig Und wenn T1.ID eindeutig ist, kannst Du das group by auch weglassen:

      Select T1.ID
      from Tabelle1 T1
      where not exists(select * from Tabelle2 T2 where T2.ID=T1.ID)

      Gruß
      docendo discimus

      Comment


      • #4
        Danke,

        ID ist eindeutig

        jetzt habe ich nur das problem das die Abfrage ganz schön lange dauert. ... ca. 1,5 Sek.

        aber andere abfragen bringen kein ergebnis...

        where not like... bring null als ergebnis...

        In der Abfrage mit subquery macht er natürlich auf alle Daten der Tabelle2 eine Abfrage....

        Die Selection auf die Tabelle 1 und seperat auf Tabelle2 brauchen jeweils nur 80ms

        Tabelle1=ca 500 Einträge die in Frage kommen
        und Tabelle2 ca 1500 EInträge die relevant sind.

        so macht er natürlich 500 x 1500 und braucht dafür länger...

        gibt es keinen inteligenteren Weg???

        Schöne Grüße
        Oliver

        Comment


        • #5
          So und jetzt habe ich die Abfrage richtig zusammen

          Select T1.ID
          from Tabelle1 T1
          Where T1.ID1 not in(select T2.ID1 from Tabelle2 T2)

          Diese Abfrage liefert ebenfalls das richtige Ergebnis
          aber braucht dafür nur 50ms anstatt 1500ms

          Comment


          • #6
            Hallo,

            da es bei Dir durch die Eindeutigkeit von T2.ID in T2.ID ja mit Sicherheit keine NULL-werte gibr, ist es für diesen Fall OK. Würde T2.ID Nullwerte enthalten, könnte es sein, dass bei dieser Abfrage gar nichts rauskommt. Ich weiss nicht, ob das bei jedem DBMS so ist, aber zumindest bei einigen. Solche Fälle haben wir hier im Forum schon behandelt.


            Gruß
            docendo discimus

            Comment


            • #7
              nun... wenn der wert null sein sollte, dann wäre das ein dicker Fehler in meiner Programmierung. der darf nie Null sein.

              Wenn es Null werte bei der Abfrage gäbe - sehe ich ein, das könnte die Abfrage durcheinander bringen.

              Aber die Abfrage die ich dann wirklichmache enthält noch wesentlich mehr Bedingungen, die hier aber nicht sinnvoll wären zu erklären, daher habe ich das stark vereinfacht.

              Da bei mir jede der beiden Tabellen noch weitere Bedingungen haben, die ich einbeziehen muss.

              Ich habe auch schon selects in der (falschen) Art gemacht,
              die mir entweder nichts gegeben haben oder ein Mega Ergebnis mit millionen von Einträgen....

              so on Danke!
              Oliver

              Comment


              • #8
                Hallo Oliver,

                solche IN-Abfragen funktionieren natürlich, aber mit unter sind sie inperformant.

                Zur Lösung könntest Du auch ein LEFT JOIN verwenden

                [highlight=SQL]Select T1.ID
                from Tabelle1 T1
                LEFT JOIN Tabelle2 T2
                ON T1.ID1 = T2.ID1
                Where T2.ID1 IS NULL[/highlight]
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  Ja... Das habe ich dann auch gedacht...

                  was aber bei dieser DB leider net Funktioniert...

                  Deshalb habe ich dann die Select mit Minus, bzw den ersatz dafür ausprobiert.

                  Ein Join ist wohl immer besser....

                  So hat jede DB wohl seine Eigenheiten.....

                  Die Not In ist allerdings einigermaßen schnell.

                  Für ca. 2000 Datensätze qreutz und quer 50ms, das scheint ganz OK zu sein.
                  Allerdings braucht die Not Exists 1500ms

                  Comment

                  Working...
                  X