Announcement

Collapse
No announcement yet.

Begrenzung der Abfrage

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

  • Begrenzung der Abfrage

    Hallo

    Ich habe eine Tabelle mit 1000 Datensätze.

    Ich will zuerst nur die ersten 20 sehen und dann die nächste 20 usw. bis ich 1000 ereiche.

    Wer kann mir helfen?

    Mit freundlichen Grüßen

    Klaus Bürkle

  • #2
    Hallo,

    beim MS SQL Server bzw. der MSDE kann auf die <b>SELECT TOP x</b>-Anweisung zurückgegriffen werden, um die Anzahl der Datensätze in der Ergebnismenge zu begrenzen. Für die ersten 20 Datensätze könnte das zum Beispiel so aussehen:

    SELECT TOP 20 * FROM Tabelle

    Um die jeweils anderen Datensätze nacheinander abzufordern, muss sich das Programm den jeweils "letzten" Primärschlüsselwert merken und nur die Datensätze abfordern, die einen höheren Wert nutzen:

    SELECT TOP 20 * FROM Tabelle WHERE Primärschlüsselwert > @LetzterPrimärschlüsselwer

    Comment


    • #3
      Hallo H. Kosch,

      danke für Ihre Antwort

      mfg

      Klaus Bürkl

      Comment


      • #4
        Wie könnte ich nun das ganze mittels Seitenanzahl machen?

        Also ich habe pro Seite 20 Datensätze...
        Jetzt klickt der Benutzer auf Seite 8 und nun?

        Unter MySQL würde ich mittels LIMIT rows, offset arbeiten...
        Gibt es sowas beim MS SQL Server auch

        Comment


        • #5
          Hallo,

          beim MS SQL Server hat man prinzipiell drei Möglichkeiten:

          1. Die Zugriffskomponenten des Clients (ADO oder ADO.NET) beschränken die Menge:

          <pre>
          DataAdapter1.Fill(DataSet11, DataGrid1.CurrentPageIndex * DataGrid1.PageSize, DataGrid1.PageSize, "TableName")
          </pre>

          2. Der SQL Server beschränkt die Menge über eine SELECT TOP-Abfrage, bei der im WHERE-Part die zu "überspringenden" Datensätze ausgeblendet werden (d.h. entweder eine Größer als-Einschränkung oder eine NOT IN SELECT TOP-Abfrage)

          3. Der SQL Server baut für diesen Benutzer einmalig eine durchnummerierte (IDENTITY) temporäre Tabelle zusammen, die dann über BETWEEN-Einschränkungen genutzt wird:

          <pre>

          SELECT IDENTITY(INT,1,1) AS RowNumber, *
          INTO #TmpCustomerTbl
          FROM Customers
          GO

          SELECT * FROM #TmpCustomerTbl
          WHERE RowNumber BETWEEN 3 AND 6
          GO

          </pre>

          Es hängt vom Datenvolumen und der Anzahl der gleichzeitigen Benutzer ab, welche der Techniken am Besten geeignet ist

          Comment


          • #6
            Also um mein Problem zu verdeutlichen...

            Ich soll ein Forum schreiben mit PHP...
            Leider muss die DB auf MS SQL Server laufen.

            Da jetzte nur 20 Posts pro Seite angezeigt werden sollen, bräuchte ich einen richtigen sauber funktionierenden Mechanismus...

            Ich könnte mir den in PHP selbst basteln, indem ich selbst zähle und dann entscheide, welchen ich anzeige...

            Allerdings erwarte ich von einer DB, dass diese den Limit Befehl kennt. Aber da hat wohl MS an manchen Dingen gespart

            Comment


            • #7
              Hallo,

              die im Vergleich zu ADO/ADO.NET beschränkte Funktionalität von PHP darf man wahrlich nicht Microsoft in die Schuhe schieben :-)

              &gt;Da jetzte nur 20 Posts pro Seite angezeigt werden sollen...

              Der Weg 2 passt doch genau für diesen Fall. Die SELECT TOP 20-Abfrage liefert immer nur maximal 20 Datensätze zurück. Und wenn der Client (PHP-Script) als WHERE-Kriterium den letzten Primärschlüsselwert der vorangegangenen Abfrage als Größer als-Einschränkung nutzt, bekommt der Client doch bei jedem Aufruf nur die nächsten 20 Datensätze, die bisher noch nicht abgefordert wurden.

              P.S: Im Fall einer Webanwendung ist ASP.NET + ADO.NET die aktuelle Technologie im Hause Microsoft. Und im Fall des .NET Frameworks ist das seitenweise Blättern bereits fest eingebaut (wie mein vorheriges Beispiel zeigt)

              Comment


              • #8
                Hallo Herr Kosch,
                Sie beschreiben 3 Möglichkeiten um die Datenmenge beim SQL-Server zu beschränken. Könnten Sie vielleicht noch was zur ersten Möglichkeit sagen. Was ist z.B. ein DataAdapter ?

                Vielen Dank für Ihre Müh

                Comment


                • #9
                  Hallo,

                  hinter einem DataAdpater steckt eine .NET-Klasse aus ADO.NET (Microsoft) oder BDP.NET (Borland). Der Zugriff auf dieses Teil ist nur mit einer .NET-Sprache (C#, VB.NET, Delphi for .NET) möglich.

                  Der DataAdapter ist ein Verbindungsglied zwischen der datenbankspezifischen Schicht (Treiber) und der Datenschicht (DataSet oder DataTable). In .NET wird der Begriff "Datenbank" sehr weit gefasst, so dass ein Datenmenge (DataSet- oder DataTable-Instanz) aus sehr vielen Quellen gefüllt werden kann. Eine "echte Datenbank" ist dabei nur eine davon.

                  Comment


                  • #10
                    Hallo Herr Kosch,

                    vielen Dank für Ihre Erläuterungen,
                    das heißt für mich, da ich über keine NET-Sprache verfüge bleibt nur Weg 2 oder 3.

                    Weg 2 funktioniert aber nur, wenn das Feld nachdem sortiert wird <B>eindeutig<B> ist. Wenn ich meine Datenmenge also z.B. nach Datum sortiert haben möchte geht das nicht, weil ein gleiches Datum ja mehrfach vorkommen kann!

                    Bleibt noch Weg über die temporäre Tabelle.
                    Dieser funktioniert in meinem Falle aber auch nicht, da ich in der Datenmenge die zurückgegeben wird unbedingt meinen ID brauche, der SQL-Server aber pro Tabelle nur ein Feld mit der IDENTITY-Eigenschaft zuläßt.

                    Frage: Gibt es die Möglichkeit die obige Select-Abfrage nur mit einem zusätzlichen hochzählenden Feld zu formulieren (statt IDENTITY(INT,1,1)) ?

                    mf

                    Comment

                    Working...
                    X