Announcement

Collapse
No announcement yet.

Ineinander verschachtelte Abfrage

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

  • Ineinander verschachtelte Abfrage

    Moin,
    ich muss eine Abfrage gestalten die relativ komplex ist. Hierzu müssen eigentlich zwei Abfragen ineinander verschachtelt werden, ich hab nur keine Ahnung wie man das lösen kann.
    Die Struktur der Tabelle sieht vereinfacht so aus:
    Resultat Datum Xkoord Ykoord
    0 11.11.2011 3 3
    1 11.11.2011 3 2
    0 11.11.2011 3 1
    1 22.02.2011 3 3
    1 22.02.2011 3 2
    Ich will jetzt die Datensätze als Rückgabemenge bekommen, deren Resultat unterschiedlich ist bei unterschiedlichem Datum aber identischen Koordinaten.
    Ist das in einem einzelnem Statement machbar?

    Um noch mal deutlich zu machen, welche Daten für mich relevant sind:
    In C würde ich das mit zwei ineinader verschachtelten for-schleifen lösen und dann
    if( (Datum1 != Datum2) && (Resultat1 != Resultat2) && (XKoord1==XKoord2) && (YKoord1==YKoord2))
    -->Datensatz relevant


  • #2
    Versuch
    select * from tabelle A where exists
    (
    select 1 from tabelle B where A.Datum ! = b.Datum && A.Resultat != B.Resultat && A.XKoord=B.XKoord && A.YKoord=B.YKoord
    )
    Zuletzt editiert von Christian Marquardt; 25.09.2019, 10:11.
    Christian

    Comment


    • #3
      Das klappt leider nicht, Fehlermeldung: Error Code 1241: Operand should contain 1 column(s).
      Kann es daran liegen, dass die Daten gar nicht in zwei Tabellen (A/B) liegen, sondern nur in einer?
      Dementsprechend hab ich folgendes statement übergeben:
      select * from foo where (select * from foo where foo.Datum!=foo.Datum &&
      foo.Result!=foo.Result &&
      foo.Xcoord=foo.Xcoord &&
      foo.Ycoord=foo.Ycoord);

      Comment


      • #4
        Nein, es ist eine Tabelle, A und B sind Aliase für die eine Tabelle


        select * from tabelle A where exists
        (
        select 1 from tabelle B where A.Datum ! = b.Datum && A.Resultat != B.Resultat && A.XKoord=B.XKoord && A.YKoord=B.YKoord
        )

        select * from foo where (select * from foo where foo.Datum!=foo.Datum &&
        Hier weiß die DB nicht, mit welchen Daten der Vergleich laufen soll. Alias fehlt
        Christian

        Comment


        • #5
          Ah, OK, verstanden
          Klappt leider immer noch nicht. Error: Subquery returns more than 1 row.

          select * from foo A where (
          select 1 from foo B where A.Datum!=B.Datum && A.Result!=B.Result && A.Xcoord=B.Xcoord && A.Ycoord=B.Ycoord
          );
          Kann das was mit der "1" zu tun haben? Was bewirkt diese?

          Comment


          • #6
            Das sollte noch ein exists stehen
            select * from foo A where exists (
            Die eins entspricht einem true. Das exists ist wahr
            Christian

            Comment


            • #7
              OK, dass gibt zumindest was zurück. Sorry, dass ich das exists übersehen habe.
              Die Rückgabemenge ist jedoch die volle Anzahl aller Zeilen, nicht nur die Anzahl deren Resultat unterschiedlich ist. Die rückgegebene Sortierreihenfolge ist jedoch anders. In der Datenbank sind noch andere Teile, deshalb habe ich mit einem weiterem "Filter" eingegrenzt auf nur Teile mit derselben ID:
              select * from foo A where exists (select 1 from foo B where A.Datum!=B.Datum &&
              A.Result!=B.Result &&
              A.Xcoord=B.Xcoord &&
              A.Ycoord=B.Ycoord &&
              A.WaferID="D16339#12");
              Kann das die Ursache sein, warum es nicht klappt?

              Hier zum Beispiel die ersten 3 rückgegebenen:

              Result ID X Y Datum
              1 D16339#12 6 3 2019-09-06
              1 D16339#12 6 3 2019-09-24
              1 D16339#12 8 4 2019-09-06
              1 D16339#12 8 4 2019-09-24
              1 D16339#12 9 4 2019-09-06
              1 D16339#12 9 4 2019-09-24
              Zuletzt editiert von bodo2407; 25.09.2019, 11:42. Reason: Rückgabetabelle eingefügt

              Comment


              • #8
                Den Filter würde ich nicht in den Subselect setzen

                select * from tabelle A where exists
                (
                select 1 from tabelle B where A.Datum ! = b.Datum && A.Resultat != B.Resultat && A.XKoord=B.XKoord && A.YKoord=B.YKoord
                ) &&A.WaferID="D16339#12"
                Christian

                Comment


                • #9
                  OK, danke!
                  Klappt jetzt, war aber noch ein Denkfehler drin: Der Filter muss natürlich innerhalb des Subqueries auch angewandt werden, sonst vergleicht er Teile aus verschiedenen IDs und gibt anschliessend die gefilterten mit der "gewollten" ID zurück. Dadurch kommen dann alle wieder an.
                  Für die Mitleser: Das korrekte Query wäre dann:
                  select * from foo A where exists (select 1 from foo B where ((A.Datum!=B.Datum) &&
                  (A.Result!=B.Result) &&
                  (A.Xcoord=B.Xcoord) &&
                  (A.Ycoord=B.Ycoord))&&
                  (B.WaferID=A.WaferID))&&(A.WaferID="D16339#12");

                  Comment

                  Working...
                  X