Announcement

Collapse
No announcement yet.

Bei mehreren Treffern nur den ersten

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

  • Bei mehreren Treffern nur den ersten

    Hallo,
    SQL ist noch nicht meine Stärke. Ich hab eine Personenliste und eine Adressliste mit n Adressen je Person. In einer Abfrage möchte ich zu jeder Person nur die erste Adresse selektieren, auch wenn n vorhanden sind.

    select
    a.ANREDE,
    a.NAME,
    a.VERMNR,
    a.VORNAME,
    b.ORT,
    b.PLZ,
    b.STRASSE,
    b.VERMNR
    from
    VD.VERM01 a,
    VD.VERM02 b
    where
    b.VERMNR = a.VERMNR

    ??? wie weiter ???

    Geht das und wenn ja wie?

    Kalli

  • #2
    Hallo,
    die Antwort auf die Frage "Geht das und wenn ja wie?" hängt davon ab, mit welcher Datenbank gearbeitet wird. Beim MS SQL Server würde zum Beispiel die <b>TOP</b>-Anweisung das Ergebnis begrenzen:
    <code>
    SELECT TOP 1 a.Anrede.....
    </code>
    Mit jeder Datenbank sollte der folgende Weg funktionieren, der nach dem Minimum des Primärschlüsselwertes der Tabelle sucht:
    <code>
    SELECT *
    FROM dbo.Employees
    WHERE City = 'London'
    AND EmployeeID = (SELECT MIN(EmployeeID)
    FROM dbo.Employees
    WHERE City = 'London')
    </code&gt

    Comment


    • #3
      Hallo Kalli,

      Frage dazu: ist es Dir dabei egal, welche Adresse, oder muss es eine bestimmte sein ?

      Gruß
      Usch

      Comment


      • #4
        Hallo Andreas, ich bin der mit DB2 und Delphi

        Hallo Uschi,
        ich selektiere die Adressen noch nach dem Kenner für Hauptadresse, der aber nicht unbedingt gesetzt sein muss. Dann ist es mir egal, welche Adresse genommen wird.

        Gruß

        Kall

        Comment


        • #5
          Hallo Kalli,

          in DB2 gibt es ein 'fetch first x row(s) only', das dann auch nur die angegebene Anzahl Zeilen liefert. Da Du ja aber nicht 1 Zeile, sondern je Person 1 Adresszeile brauchst, musst Du das in ein Subselect packen.

          ...
          from
          VD.VERM01 a,
          VD.VERM02 b
          where
          b.VERMNR = a.VERMNR and
          b.Hauptadress-Kenner =
          (select Hauptadress-Kenner from VD.VERM02 c where
          [Pkey b = Pkey c] order by c.Hauptadress-Kenner fetch first 1 row only)

          ob Dein Order by ASC oder DESC sein muss, hängt vo der Art/Befüllung Deines Kenners für die Hauptadresse ab. Eventuell brauchst Du auch noch ein '>' oder '<' im für den Kenner in der Subselect-where-Bedingung.

          Gruß
          Usch

          Comment


          • #6
            Hi Uschi,
            hab ich den verkehrten Beruf???
            In Verm2 sind die Adressen. Hier gibt es den Kenner HAUPT, mit Stern = Vorzugsadresse. Dies ist aber nicht immer gesetzt.
            .
            select
            a.NAME,
            a.VDKONTO,
            a.VERMART,
            a.VERMNR,
            a.VERMTYP,
            a.VORNAME,
            b.ART,
            b.HAUPT,
            b.ORT,
            b.PLZ,
            b.STRASSE,
            b.VERMNR
            from
            VD.VERM01 a,
            VD.VERM02 b
            where
            b.VERMNR = a.VERMNR
            .
            .
            Ich hab jetzt einiges versucht, bin aber zu keinem Ergebnis gekommen. Hast Du noch einen Tipp?
            Gruß
            Kall

            Comment


            • #7
              Hallo Kalli,

              also
              1. sorry, das mit dem b.pkey = c.pkey war Quatsch
              das solte bloß b.vermnr = c.vermnr sein.
              2.das '=' auf den Subselect muß wahrscheinlich ein 'in' sein (auch wenn Du 1 Zeile erzwingst)
              3. da ich kein DB2 mehr zum select absetzen habe (bin jetzt fast bloß noch auf Oracle) - bekommst Du Fehlermeldungen oder bloß kein vernünftiges Ergebnis ?

              der Subselect soll sortiert nach dem 'HAUPT' die Adressen holen und dabei nur einen Satz liefern. Deshalb der 'order by' und der 'fetch first 1 row only'.

              Müsste eigentlich funktionieren.
              Wenn das so nicht funktionieren will, musst Du Dir überlegen welches Kriterium (ART, PLZ, ...) Du als MAX() oder MIN()-bedingung aussuchen kannst, für die Fälle wo Du kein haupt = '*' hast.
              z.B.

              from
              VD.VERM01 a,
              VD.VERM02 b
              where
              b.VERMNR = a.VERMNR
              and (b.haupt = '*' or
              (b.haupt <> '*' and art =
              (select max(art) from vd.verm02 c where b.vermnr = c.vermnr)
              and not exists
              (select * from vd.verm02 d where b.vermnr = d.vermnr and
              d.haupt = '*')
              )
              )

              die Performance wird dabei aber nicht gerade besser.

              Gruß
              Usch

              Comment


              • #8
                Hallo Uschi,
                dass Du mit Pkey den Hauptschlüssel meintest war mir schon klar. Nur bekam ich immer irgendwelche Fehlermeldungen. Z.B. wollte er nach dem where a = b kein order by, oder er war der Meinung, das c.HAUPT an dieser Stelle nicht erlaubt sei und so ...

                Ich hab jetzt mal einfach den Rest der Selection angehängt und habe das richtige Ergebnis. Jetzt muss ich das nur noch irgendwie nachvollziehen, um es zu verstehen.

                Gruß und bis zum nächsten Problem (es wird nicht lange dauern)
                Kalli
                PS
                kannst Du mir ein Buch empfehlen

                Comment


                • #9
                  Hallo Kalli,

                  fein, dass es jetzt tut. Welche Version funktioniert denn, die mit den 2 Subselects oder die mit dem find first row ?
                  Aber ein passendes Buch wüsst ich leider auch nicht. Zu SQL gibt's viel, aber für DB2-Spezialitäten sieht's traurig aus.
                  Dafür hat man ja aber heutzutage auch die Foren. Irgendwer weiß eigentlich immer was.

                  Gruß
                  Usch

                  Comment

                  Working...
                  X