Announcement

Collapse
No announcement yet.

Limit auf Anzahl der Datensätze

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

  • Limit auf Anzahl der Datensätze

    Hallo,

    nur eine kurze Frage, gibt es bei Firebird eine Möglichkeit die Anzahl von Datensätzen bei Ausgabe z.B. bei einem View zu begrenzen.

    cu Jan

  • #2
    Hallo Jan,

    ja die gibt es.

    Auszug aus den deutschen Release Notes:

    <pre>
    (1.0) SELECT [FIRST (<integer expr m>)] [SKIP (<integer expr n>)]
    (1.5) SELECT FIRST kann jetzt auch Null (0) als Argument verarbeiten
    FB 1.5 erlaubt Null (0) als ein Argument für den FIRST Befehl. Eine leere Ergebnismenge wird zurückgeliefert.
    Es werden die ersten m Zeilen der gewählten Ergebnismenge zurückgegeben. Durch die optionale SKIP
    Anweisung werden die ersten n Zeilen verworfen und es werden m Datensätze ab der Position n+1 zu-
    rückgegeben. In der einfachsten Form sind m und n Integer, aber ebenso ist jegliche Firebird-
    Anweisung, die einen Integer zurückgibt, gültig. Ein Identifizierer, der einen Integer darstellt, kann in
    GDML verwendet werden, dies ist jedoch in SQL oder DSQL nicht zulässig.
    Klammern sind für Ausdrucksargumente zwingend notwendig, ansonsten sind sie optional.
    Es können auch Variablen eingebunden werden, so gibt z.B. SKIP ? * FROM ATABLE die verbliebene Ergebnismenge
    zurück, nachdem die ersten n Datensätze am Beginn ausgeschlossen wurden, wobei n den
    Wert, der in der Variable ? übergeben wurde, darstellt. SELECT FIRST ? COLUMNA, COLUMNB FROM
    ATABLE gibt die ersten m Datensätze zurück und verwirft den Rest.
    Die FIRST Anweisung ist optional, d.h. sie können SKIP in einer Anweisung ohne FIRST verwenden, um
    eine Ergebnismenge, ohne die Datensätze die SKIP ausschließt, zu erhalten.
    Verfügbar in SQL und DSQL mit Ausnahme der angegeben Einschränkungen.
    Beispiele:
    SELECT SKIP (5+3*5) * FROM MYTABLE;
    SELECT FIRST (4-2) SKIP ? * FROM MYTABLE;
    SELECT FIRST 5 DISTINCT FIELD FROM MYTABLE;
    Zwei Fallstricke bei SELECT FIRST
    1. Diese Anweisung
    delete from TAB1 where PK1 in (select first 10 PK1 from TAB1);
    wird alle Zeilen in der Tabelle löschen. Autsch! Die Unterabfrage wählt jeweils 10 Kandidaten für das
    Löschen aus, löscht sie, holt sich die nächsten 10 Sätze … etc., bis keine Sätze mehr vorhanden sind.
    Also: VORSICHT!
    2. Abfragen wie z.B.:
    ...
    WHERE F1 IN ( SELECT FIRST 5 F2 FROM TABLE2 ORDER BY 1 DESC )
    Werden nicht wie erwartet abgearbeitet, da die Optimierung, die vom Datenbanksystem durchgeführt
    wird, korrelierende WHERE...IN (SELECT...) Prädikate in korrelierende EXITS Prädikate umsetzt. Es ist
    offensichtlich, dass in diesem Falle der Gebrauch von FIRST N nicht sinnvoll ist:
    WHERE EXISTS (
    SELECT FIRST 5 TABLE2.F2 FROM TABLE2
    WHERE TABLE2.F2 = TABLE1.F1 ORDER BY 1 DESC )
    </pre>
    ...

    Gruß

    Torste

    Comment


    • #3
      Hallo,

      das funktioniert soweit so gut, aber setze ich die FIRST und/oder SKIP Anweisung in einem VIEW mit einer UNION Anweisung ein erscheint eine Fehlermeldung. Das View soll zum auslesen aller einzelnen Generatorstände dienen. Vielleicht hast die eine Lösung ?

      CREATE VIEW GENRATORSTAND(<BR>
      WERT)<BR>
      AS<BR>
      select gen_id( gen_anreden_id, 0) from Anreden union all<BR>
      select gen_id( gen_kontakt_adressen_id, 0) from kontakt_adressen union all<BR>
      select gen_id( gen_kontakt_id, 0) from kontakt union all<BR>
      select gen_id( gen_kontakt_komm_id, 0) from kontakt_komm union all<BR>
      select gen_id( gen_kontakt_partner_id, 0) from kontakt_partner union all<BR>
      select gen_id( gen_ort_id, 0) from ort union all<BR>
      select gen_id( gen_sprachen_id, 0) from sprachen union all<BR>
      select gen_id( gen_strassen_id, 0) from strassen
      ;

      das Ergenis sieht bei mir dann folgender massen aus

      18<BR>
      18<BR>
      18<BR>
      18<BR>
      .<BR>
      .<BR>
      .<BR>
      12<BR>
      12<BR>
      12<BR>
      3<BR>
      3<BR>
      3<BR>
      usw.<BR>

      ich möchte aber das für jeden Generator auch nur eine Zeile ausgegeben wird.

      cu Ja

      Comment


      • #4
        Jan,<p>
        wenn Du:
        select gen_id( gen_anreden_id, 0) from TABELLE<br>
        eingibst, bekommst Du n-Sätze dafür zurück, wobei n die Anzahl der Datensätze in Tabelle ist.<br>
        Wenn Du nur einen Satz haben willst, mach das select auf RDB$DATABASE, diese Tabelle hat IMMER EINEN und NUR EINEN Datensatz.<br>
        Also:<br>
        select gen_id( gen_anreden_id, 0) from RDB$DATABASE<p>
        Da es sich um eine "fixe" Abfrage bzgl. der bestehenden Generatoren handelt, wäre es allerdings einfacher (und von der Ausgabe her auch übersichtlicher), dies mit einer Storedprocedure zu erledigen.<p>
        Luc

        Comment


        • #5
          hallo,

          alles klar, Danke !

          cu Ja

          Comment


          • #6
            Hallo Torsten,

            wo gibet es die deutschen Release Notes im Netz?

            augenreibend,
            Mirk

            Comment


            • #7
              Hallo Mirko,

              http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_download_15

              Gruß

              Torste

              Comment

              Working...
              X