Peter: ntes Element bei Lücken abfragen

Hallo,

angenommen eine Tabelle hat folgende Struktur und Einträge:

id PK
eintrag

---

2 E1
4 E2
7 E3
8 E4
11 E5

Mit welcher SQL-Abfrage lässt sich für das vierte Element die ID 8 ermitteln, also

select id from tabelle where (n=4)

Der Teil in Klammern ist unklar.

  1. TOP oder LIMIT dürften dich je nach DBMS interessieren.

    In diesem Kontext solltest du dich zudem mit ORDER BY auseinandersetzen.

    1. TOP oder LIMIT dürften dich je nach DBMS interessieren.

      In diesem Kontext solltest du dich zudem mit ORDER BY auseinandersetzen.

      An limit dachte ich als Unterabfrage, aber ich weiß nicht, ob das unperformant ist. TOP sagt mir gerade nichts, das könnte genau das sein, was ich brauche. Order by ist ja id asc.

      1. An limit dachte ich als Unterabfrage, aber ich weiß nicht, ob das unperformant ist.

        LIMIT ist MySQL-spezifisch.

        TOP sagt mir gerade nichts, das könnte genau das sein, was ich brauche.

        TOP ist MSSQL-spezfisch - wenn dir TOP reichen würde, ist Limit auch genug.

        Order by ist ja id asc.

        Na dann.

        1. An limit dachte ich als Unterabfrage, aber ich weiß nicht, ob das unperformant ist.

          LIMIT ist MySQL-spezifisch.

          TOP sagt mir gerade nichts, das könnte genau das sein, was ich brauche.

          TOP ist MSSQL-spezfisch - wenn dir TOP reichen würde, ist Limit auch genug.

          Order by ist ja id asc.

          Na dann.

          Für alle, die mal in eine ähnlich falsche Richtung denken, ich hatte einen Denkfehler:

          Ich nahm an

          select id from tabelle limit 8,1

          liefert als Ergebnis 8, wobei sich der erste Parameter nach limit auf den PK bezöge.

          Bei genauerem Nachdenken wird klar, dies kann nicht so sein, da der PK nicht notwendigerweise numerisch ist, der Parameter aber schon.

          Der steht daher auch richtigerweise schon für das nte Element, ab dem die Begrenzung beginnen soll, weswegen

          select id from tabelle limit 4,1

          sehr simpel das gewünschte Resultat (nämlich 8) liefert ohne komplizierte Unterabfrage.

          An den Antwortenden: Die Frage war klar formuliert, die Lösung in 5 Sekunden zu notieren. Wieso dann solch wenig zielführenden Antworten? Zu viel Freizeit?

          Ich hatte offensichtlich einen Blackout, sonst hätte ich nach Jahren der Programmierung nicht so etwas gefragt. Mir hat diese in die völlig falsche Richtung weisende Antwort nichts als Zeit gestohlen, da ich nach top suchte und eine DB-Klasse um eine eigene Methode zum Abfragen des nten Elements erweiterte. Hätte ich bloß eher diese zwei simplen SQL-Abfragen durchgeführt, hätte ich mir Zeit und Ärger gespart, mich mit solch sinnlosen Antworten auseinanderzusetzen. Ich denke, ein Anfänger hätte ziemlich dumm dagestanden. Also bitte, wenn Ihr nicht wirklich helfen wollt, antwortet einfach nicht.

          1. Hi,

            select id from tabelle limit 8,1
            liefert als Ergebnis 8, wobei sich der erste Parameter nach limit auf den PK bezöge.

            Zufall - denn Du sortierst nicht.

            An den Antwortenden: Die Frage war klar formuliert,

            Nein. Du hattest z.B. nicht einmal erwähnt, welches Datenbanksystem Du einsetzt.

            die Lösung in 5 Sekunden zu notieren. Wieso dann solch wenig zielführenden Antworten? Zu viel Freizeit?

            Hier gibt's Hilfe zur Selbsthilfe, nicht Fertigscripts.

            Ich hatte offensichtlich einen Blackout, sonst hätte ich nach Jahren der Programmierung nicht so etwas gefragt. Mir hat diese in die völlig falsche Richtung weisende Antwort nichts als Zeit gestohlen, da ich nach top suchte

            Hättest Du ordentlich gefragt, hätte suit TOP gar nicht erwähnt.
            ==> selbst schuld.

            Hätte ich bloß eher diese zwei simplen SQL-Abfragen durchgeführt, hätte ich mir Zeit und Ärger gespart, mich mit solch sinnlosen Antworten auseinanderzusetzen. Ich denke, ein Anfänger hätte ziemlich dumm dagestanden. Also bitte, wenn Ihr nicht wirklich helfen wollt, antwortet einfach nicht.

            Heul doch. Oder erwähne gleich die relevanten Fakten bei der Frage. Dann kann auch gezielter geantwortet werden.

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          2. Hi,

            An den Antwortenden: Die Frage war klar formuliert, die Lösung in 5 Sekunden zu notieren. Wieso dann solch wenig zielführenden Antworten? Zu viel Freizeit?

            Wieso solches Gemecker?

            Ich hatte offensichtlich einen Blackout, sonst hätte ich nach Jahren der Programmierung nicht so etwas gefragt.

            Den zu beseitigen dir die Antworten ja offenbar geholfen haben.

            Mir hat diese in die völlig falsche Richtung weisende Antwort nichts als Zeit gestohlen, da ich nach top suchte und eine DB-Klasse um eine eigene Methode zum Abfragen des nten Elements erweiterte.

            JFC ... du hast anfangs noch nicht mal erwähnt, mit *welchem* DBMS du arbeitest - obwohl du bei der Erstelleung eines Threads im Themenbereich Datenbanken *explizit* darauf hingewiesen wirst.
            Und jetzt willst du hier noch so einen Aufstand machen wegen angeblich „nicht zielführender Antworten“, weil jemand seine Antwort auf Grund *deines* Versäumnisses allgemein gehalten hat und deshalb auch TOP erwähnte ...?

            Offenbar hast du immer noch einen Blackout, oder schon wieder einen neuen.

            Hätte ich bloß eher diese zwei simplen SQL-Abfragen durchgeführt, hätte ich mir Zeit und Ärger gespart, mich mit solch sinnlosen Antworten auseinanderzusetzen. Ich denke, ein Anfänger hätte ziemlich dumm dagestanden. Also bitte, wenn Ihr nicht wirklich helfen wollt, antwortet einfach nicht.

            Du stehst gerade ziemlich dumm da, weil du dich gerade ziemlich dumm benimmst.

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            1. Hi,

              obwohl du bei der Erstelleung eines Threads im Themenbereich Datenbanken *explizit* darauf hingewiesen wirst.

              Tatsache. Ist mir noch nie aufgefallen. So viele DB-Fragen hab ich aber auch nicht ...

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          3. Ich denke, ein Anfänger hätte ziemlich dumm dagestanden.

            Deine Fragestellung war von der Art her weit unter dem Niveau eines Anfängers - mehr war im Rahmen nicht möglich, du warst nichtmal so weit, uns dein verwendetes DBMS zu verraten.

            Ich hätte dir nebst LIMIT und TOP auch noch OFFSET und FETCH FIRST vorschlagen können, wie es ISO/IEC 9075:2008 vorsieht - damit hättest du mit PostgreSQL sicher eine Freude gehabt, im Falle von MSSQL oder MySQL hättest du aber sich Probleme gehabt, das in der Doku zu finden.

            Also bitte, wenn Ihr nicht wirklich helfen wollt, antwortet einfach nicht.

            Du unterstellst also, Ilja oder ich würden nicht helfen wollen? Woher willts du das wissen? Habe ich dich absichtlich in die Irre geführt?

            1. Hi,

              Du unterstellst also, Ilja oder ich würden nicht helfen wollen? Woher willts du das wissen? Habe ich dich absichtlich in die Irre geführt?

              Nein, ihr habt beide einen Irren geführt - der sich jetzt offenbar auch noch zum Affen machen will.

              MfG ChrisB

              --
              “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            2. Hi,

              Ich hätte dir nebst LIMIT und TOP auch noch OFFSET und FETCH FIRST vorschlagen können, wie es ISO/IEC 9075:2008 vorsieht

              oder Oracles ROWNUM ...

              Habe ich dich absichtlich in die Irre geführt?

              Nein, Du hast ja explizit noch erwähnt, daß es vom DBMS abhängt.

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
              1. moin,

                oder Oracles ROWNUM ...

                bei ROWNUM ist vorsicht geboten bei solch sortier-abfragen. es geht, aber ist tricky.

                Ilja

                1. Hi,

                  oder Oracles ROWNUM ...

                  bei ROWNUM ist vorsicht geboten bei solch sortier-abfragen. es geht, aber ist tricky.

                  Ich weiß ...

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  O o ostern ...
                  Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                  1. Hallo Andreas und Ilja,

                    oder Oracles ROWNUM ...
                    bei ROWNUM ist vorsicht geboten bei solch sortier-abfragen. es geht, aber ist tricky.
                    Ich weiß ...

                    ... und ich erinnere mich ...

                    Freundliche Grüße

                    Vinzenz

            3. Ich denke, ein Anfänger hätte ziemlich dumm dagestanden.

              Deine Fragestellung war von der Art her weit unter dem Niveau eines Anfängers - mehr war im Rahmen nicht möglich, du warst nichtmal so weit, uns dein verwendetes DBMS zu verraten.

              Aha, noch unter dem Niveau eines Änfangers, ach so, die Irren, wie an anderer Stelle angeführt wird.

              Ich hätte dir nebst LIMIT und TOP auch noch OFFSET und FETCH FIRST vorschlagen können, wie es ISO/IEC 9075:2008 vorsieht - damit hättest du mit PostgreSQL sicher eine Freude gehabt, im Falle von MSSQL oder MySQL hättest du aber sich Probleme gehabt, das in der Doku zu finden.

              Ich entschuldige mich bei Dir, wenn Deine Antwort aufrichtig helfen wollte und es aufgrund fehlender Informationen nicht dazu kam. Immerhin kam man dann aber - vor allem, wenn man meint, man hat es mit jemandem zu tun, der noch unter einem Anfänger steht - fehlende Informationen nachfragen, deren sich ein Anfänger nicht bewusst ist, dass sie relevant sind, oder nicht?

              Ich stand unter großem Zeitdruck, diese Angelegenheit noch fertigzubekommen. Unter Druck passieren schon mal Fehler, die sonst nicht passieren. Und Versäumnisse, man hätte wohl auf das DBMS und die Sortierung nach aufsteigender ID beim select hinweisen müssen.

              Also bitte, wenn Ihr nicht wirklich helfen wollt, antwortet einfach nicht.

              Du unterstellst also, Ilja oder ich würden nicht helfen wollen? Woher willts du das wissen? Habe ich dich absichtlich in die Irre geführt?

              Es hatte den Eindruck, dass Du die Vorgehensweise vorenthältst, obwohl Du genau weißt, was ich beabsichtige, ja, und es bezog sich nur auf Dich. Die Antwort von Ilja war durchaus konstruktiv. Da die wesentliche Information der Sortierung nicht bzw. nicht explizit gegeben wurde, war die Anforderung nicht hinreichend geklärt. Wenn ich Dir also unrecht tue, entschuldige ich mich aufrichtig.

              Leider werden Foren von Typen missbraucht, die unter der Maske der Hilfsbereitschaft den Oberlehrer spielen, Frust ablassen etc., deswegen die Frage nach zu viel Freizeit, da ich diesen Eindruck hatte. Solche Leute kotzen mich an, und sie sollten sich lieber Foren fernhalten, wobei sich mir der Eindruck aufdrängt, dies ist in Deutschland besonders schlimm. In englischsprachigen Foren ist ein solches Verhalten m. E. viel weniger ausgeprägt.

              @alle anderen, die meinen, richtig nachtreten zu müssen: Bellen da die getroffenen Hunde?

              1. Ich hab hier schon mal ausführlich geantwortet - dennoch hier noch ein paar Zeilen dazu.

                Ich denke, ein Anfänger hätte ziemlich dumm dagestanden.

                Deine Fragestellung war von der Art her weit unter dem Niveau eines Anfängers - mehr war im Rahmen nicht möglich, du warst nichtmal so weit, uns dein verwendetes DBMS zu verraten.

                Aha, noch unter dem Niveau eines Änfangers, ach so, die Irren, wie an anderer Stelle angeführt wird.

                Mein Fehler, das hab' ich falsch formuliert. Ich wollte damit eigentlich sagen, dass du in einem Posting Anfängerfehler machst und wichtige Informationen unterschlägst.

                Der Informationsgehalt lag unter dem Niveau eines Anfängers, die Formulierung der Frage ansich war ok.

                Ein "Wie beschränke ich mit MySQL die Anzahl und das Offeset der Datensätze?" oder vergleichbares wäre ggf. schlauer und kürzer gewesen, als deine übersichtliche Aufstellung.

                Ich entschuldige mich bei Dir, wenn Deine Antwort aufrichtig helfen wollte und es aufgrund fehlender Informationen nicht dazu kam.

                Keine Ursache auch ich hab' in meinem Folgepostung unangemessen reagiert.

                Immerhin kam man dann aber - vor allem, wenn man meint, man hat es mit jemandem zu tun, der noch unter einem Anfänger steht - fehlende Informationen nachfragen, deren sich ein Anfänger nicht bewusst ist, dass sie relevant sind, oder nicht?

                Ja kann man - aber ich gehe (leider) bei solchen Posts immer wieder von meinem Geist und meiner Denkweise aus - für mich geht aus "je nach DBMS" klar hervor, dass es mehrere Möglichkeiten gibt und hier ggf. noch eine Information für die eindeutige Benantwortung der Frage fehlt.

                Es hatte den Eindruck, dass Du die Vorgehensweise vorenthältst, obwohl Du genau weißt, was ich beabsichtige, ja, und es bezog sich nur auf Dich.

                Ich hatte mit Ilja diesbezüglich grade kürzlich eine Diskussion: ich enthalte Informationen nicht vor, weil ich es weiß und nicht sagen will, sondern weil ich davon ausgehe, dass ein Stichwort für jemanden der eine Suchmaschine bedienen kann ausreicht - wenn das nicht der Fall ist und weitere Fragen auftauchen, kann man ja nochmal nachfragen.

                Aber ich verschwende ungern Zeit (die ich nicht habe) in eine sehr ausführlich Antwort bei einem so jungen posting, wenn sich der Fragesteller entweder nicht mehr meldet oder Gefahr besteht, dass jemand anderer schneller ist und eine fertige Lösung hinrotzt und meinen heoretischen Lösungsweg übergeht und mein getippe umsonst war.

                Wenn sich auch nach Tagen oder Stunden keine Antwort findet und ich die Zeit habe, gebe ich (bei Interesse des OP) durchaus ausführlichere Anworten.

                Die Antwort von Ilja war durchaus konstruktiv.

                Jein - das gesagte ist zwar richtig, aber imho sinnfrei unter dem Gesichtspunkt, dass du ein Feld mit dem Bezeichner "id" hast. Mit gesundem Menschenverstand gehe ich davon aus, dass der Wert darin eindeutig ist und du vermutlich auch Aufsteigend sortierst (wie du später auch bestätigt hast).

                Zudem ist mir bei Iljas Post nicht klar, warum eine Unterabfrage mittels Aggregatfunktion das genannte Problem lösen könnte.

                Wenn zwei Datensätze dieselbe ID haben, ist deren Reihung - sofern nicht nach einem zusätzlichen Feld sortiert wird - willkürlich.

                Ob ich das mit einer Aggregatfunktion wie RANK() OVER mache oder in der ORDER-BY-Optimierung einfach mehrere Feldnamen angebe, ist ansich egal (zumindet wenn man bei nicht Standardkonformen varianten bleibt, da SQL:2003 ohnehin primär die Variante mit der Aggregatfunktion vorsieht.

                Ich lasse mich aber gerne aufklären.

                Leider werden Foren von Typen missbraucht, die unter der Maske der Hilfsbereitschaft den Oberlehrer spielen, Frust ablassen etc., deswegen die Frage nach zu viel Freizeit, da ich diesen Eindruck hatte.

                Kommt vor, ja.

                Solche Leute kotzen mich an, und sie sollten sich lieber Foren fernhalten, wobei sich mir der Eindruck aufdrängt, dies ist in Deutschland besonders schlimm.

                Ja, die Deutschen sind diesbezüglich eine Seuche, die Bürokratie liegt da irgendwie in sämtlichen Erblinien - ich bin froh, dass ich Österreicher bin :p

                In englischsprachigen Foren ist ein solches Verhalten m. E. viel weniger ausgeprägt.

                Teils -  ich bin auch viel in englischsprachigen Newsgroups unterwegs, man erkennt da schon an Art der Kommunikation ob es sich um Deutsche handelt ;)

                Aber genug der Xenophobie - ich hab' auch die Deutschen lieb.

                1. moin,

                  Der Informationsgehalt lag unter dem Niveau eines Anfängers, die Formulierung der Frage ansich war ok.

                  meine erfahrung ist die, dass gerade anfänger wichtige informationen nicht mit anführen werden, einfach aus dem grund, weil sie sich nicht bewußt sind, was wirklich wichtig ist. dazu gehört einfach erfahrung und genau die fehlt eben bei anfängern. ich finde es deshalb auch nicht schlimm, wenn man immer wieder nach bestimmten relevanten daten nachfragen muss, das liegt in der natur der sache.

                  Immerhin kam man dann aber - vor allem, wenn man meint, man hat es mit jemandem zu tun, der noch unter einem Anfänger steht - fehlende Informationen nachfragen, deren sich ein Anfänger nicht bewusst ist, dass sie relevant sind, oder nicht?

                  Ja kann man - aber ich gehe (leider) bei solchen Posts immer wieder von meinem Geist und meiner Denkweise aus - für mich geht aus "je nach DBMS" klar hervor, dass es mehrere Möglichkeiten gibt und hier ggf. noch eine Information für die eindeutige Benantwortung der Frage fehlt.

                  da will ich Peter recht geben, ein anfänger kann einfach in sehr vielen fällen wichtige informationen, die lösungen und pitfalls nicht sehen, selbst wenn sie in der Doku stehen. wir haben ja darüber schon diskutiert, dass man mit knappen stichwörterm einen anfänger auch fehlleiten kann, auch wenn das sicherlich nicht immer der fall ist. es gibt andere foren, wo man davon ausgehen kann, dass man mit stichwörtern jemanden gut weiterbringt, das OTN forum wäre zum beispiel ein solches. aber die meisten, die hier fragen suchen, wird damit nicht wirklich geholfen werden.

                  Ich hatte mit Ilja diesbezüglich grade kürzlich eine Diskussion: ich enthalte Informationen nicht vor, weil ich es weiß und nicht sagen will, sondern weil ich davon ausgehe, dass ein Stichwort für jemanden der eine Suchmaschine bedienen kann ausreicht - wenn das nicht der Fall ist und weitere Fragen auftauchen, kann man ja nochmal nachfragen.

                  ich denke, Peter hat es inzwischen auch eingesehen, dass du informationen nicht vorenthälst, weil du keine lust drauf hast, sondern weil du einen anderen "hilfs-ansatz" verfolgst. aber genau das ist ja schon lange ein streitpunkt hier bei selfthtml und ich denke, man kann den einfach auch mal überdenken. ein anfänger wird eben oftmals trotz stichwörter, suchmaschinen und doku nicht so einfach zum ziel kommen. gerade anfänger brauchen zu beginn ein wenig mehr "pflege", ein wenig starthilfe, bevor sie mit geschlosssen augen durch eine doku wandern können und die sollte man ihnen auch geben. mich erinnert das manchmal ein wenig an das buch "per anhalter durch die galaxis". ich glaube es waren die vogonen, deren aushang über die zerstörung der erde man ja hätte nachlesen können.....

                  Zudem ist mir bei Iljas Post nicht klar, warum eine Unterabfrage mittels Aggregatfunktion das genannte Problem lösen könnte.

                  das problem läßt sich auch mit MIN/MAX in unterabfragen lösen und in bestimmten fällen ist es auch die einzige möglichkeit, zum beispiel bei anforderungen wie bei der vergabe von medaillen bei olympia. so was bekommst du dann mit LIMIT nicht mehr hin. ist aber teilweise aufwendiger, dafür aber auch in aller regel kompatibel zu anderen dbms.

                  Wenn zwei Datensätze dieselbe ID haben, ist deren Reihung - sofern nicht nach einem zusätzlichen Feld sortiert wird - willkürlich.

                  so was halte ich zum beispiel für eine sehr sinnvolle information, die ein anfänger leicht übersehen wird, weil er zufällig das richtige ergebnis bekommt.

                  Ilja

                  1. so was halte ich zum beispiel für eine sehr sinnvolle information, die ein anfänger leicht übersehen wird, weil er zufällig das richtige ergebnis bekommt.

                    Darum gab's auch in meinem ersten Posting den Hinweis auf ORDER BY :)

                    1. moin,

                      so was halte ich zum beispiel für eine sehr sinnvolle information, die ein anfänger leicht übersehen wird, weil er zufällig das richtige ergebnis bekommt.

                      Darum gab's auch in meinem ersten Posting den Hinweis auf ORDER BY :)

                      und so was finde ich dann sehr gut und würde sagen, dass man es grundsätzlich so tun sollte, nicht auf deine person bezogen, sondern grundsätzlich als forums motto.

                      Ilja

          4. Moin!

            An den Antwortenden: Die Frage war klar formuliert, die Lösung in 5 Sekunden zu notieren. Wieso dann solch wenig zielführenden Antworten? Zu viel Freizeit?

            Die Frage war klar, hat aber offen gelassen, welche Datenbank du verwendest. Suits Antwort war dementsprechend sogar für ZWEI Datenbanksysteme gültig und in 5 Sekunden notiert.

            Annehmend, dass du des Lesens und Recherchierens kundig bist, und das Handbuch der von dir verwendeten Datenbank nach den entsprechenden Stichworten bzw. genannten Befehlen durchsuchen kannst, ist eigentlich gar nicht mehr notwendig.

            Denn schließlich hattest du "nur"

            [...] offensichtlich einen Blackout, sonst hätte ich nach Jahren der Programmierung nicht so etwas gefragt.

            Wenn du Programmiererfahrung hast, musst du in der Lage sein, Dokumentation nach dir genannten Stichworten zu durchsuchen.

            Ich denke, ein Anfänger hätte ziemlich dumm dagestanden. Also bitte, wenn Ihr nicht wirklich helfen wollt, antwortet einfach nicht.

            Suits Antworten sind aber nun mal exakt von der Form, die man braucht, wenn man als erfahrener Programmierer nur das entfallene Stichwort braucht - also genau auf Leute wie dich abgestimmt.

            Und wenn danach noch Verständnisfragen auftreten, wäre das ja im Thread klärbar gewesen.

            - Sven Rautenberg

            1. Suits Antwort war dementsprechend sogar für ZWEI Datenbanksysteme gültig und in 5 Sekunden notiert.

              Suits Antworten sind aber nun mal exakt von der Form, die man braucht, wenn man als erfahrener Programmierer nur das entfallene Stichwort braucht - also genau auf Leute wie dich abgestimmt.

              Fürs Protkoll: meine Antworten sind häufig sehr kurz, weil ich diese in Arbeitspausen nebenbei verfasse. Ich hab' einfach nicht die Zeit, entsprechend ausführlich zu antworten und gib' einfach ein paar Hinweise die mir in diesem Fall weiterhelfen würden. Aus diesem Grund kommt es auch vor, dass ich schonmal einen Hinweis gebe, der schon gegeben wurde, weil ich auch nicht die Zeit habe, vollständige Threads zu lesen.

              Ich betone immer wieder: wenn ich eine Frage stelle und ich so eine Antwort erhalte, bin ich heilfroh wenn die Antwort unmittelbar und "sofort" kommt, da ich dann sofort Stichworte für eine weitere Suche habe und sofort weiterarbeiten kann, ohne lange warten zu müssen. Mit den Stichworten findet man meistens irgendwo in den weiten des Internet irgendwelche Foren- oder Newsgroup-Einträge die diese Problematik beschreiben - oder eben gleich die richtige Stelle in der ggf. vorhandenen Dokumentation. Es hilft mir mehr, wenn jemand binnen 5 Minuten ein paar Stichworte oder Links hinknallt alswenn sich jemand 45 Minuten Zeit nimmt, um mir alles ausführlich zu erklären obwohl mir eigentlich nur irgend ein Stichwort entfallen ist oder mit irgend ein Funktionsname (noch) unbekannt ist.

              Bei ausführlichen Antworten bin ich natürlich auch nicht böse - auch wenn dort dinge erklärt werden, die ich ohnehin schon weis. Denn ich verfolge auch gerne die Ansätze und Lösungswege anderer und lerne dazu, zudem sind dann solche Lösungswege für andere interessant, die eben nur ein paar Stichworte vorgeworfen bekommen und dann so schnell auf einen bereits gelösten Thread zu diesem Thema stoßen.

              Zurück zu diesem Thread:
              Besonders in diesem Fall wäre es sehr umfangreich, sämtliche Lösungswege ohne Nachfrage aufzuschlüssen, da sich kein DBMS in diesem Punkt wirklich an den entsprechenden SQL-Standard hält und jedes seine eigene Syntax mitbringt.

              Hier nochmal der "Vollständigkeit" halber die Möglichkeiten:
              SQL:2003 sieht RANK() OVER in einem Subquery vor

              PostgreSQL kennt die Notation LIMIT x OFFSET y

              MSSQL nutzt wie gesagt TOP, mit offset ist es etwas Tricky weil das afaik nicht vorgesehen ist

              MySQL nutzt simpel LIMIT y, x oder aber die von Ilja vorgeschlagene Variante mit Subquery und COALESCE wo dann ebenfalls LIMIT x OFFSET y genutzt werden kann

              Ich hatte als beim Verfassen im Rahmen der Zeit also drei Möglichkeiten:

              a) nicht antworten
              b) mögliche Stichworte aufzählen
              c) "Welches DBMS verwendest du?"

              Aufgrund der Tatsache, dass mir b) unmittelbar am hilfreichsten erschien, habe ich so geantwortet - und aus dem Kopf konnte ich nur die MySQL- und MSSQL-Variante liefern.

              Gegen vollständige Beispiele habe ich mich entschieden, weil es eben kompliziert und aufwändig ist oder ggf. sogar unsinnig. Was nutzt dir ein vollständig fertiger und perferkter Lösungsweg für MySQL wenn ein anderes DBMS oder gar nur minimalisierte Abstraktionsschicht verwendest?

              Es hätte mich unnötig Zeit gekostet und dir nicht womöglich nicht geholfen obwohl sehr viele Datenbankprobleme in diesem Forum in der Tat mit MySQL zu tun haben - aber eben nicht alle.

              Der Grund warum ich jetzt ausführlich antworte: es ist nach 21 Uhr und ich bin jetzt zu Hause, ich hab' Zeit.

              1. Suits Antwort war dementsprechend sogar für ZWEI Datenbanksysteme gültig und in 5 Sekunden notiert.

                Fürs Protkoll: meine Antworten sind häufig sehr kurz, weil ich diese in Arbeitspausen nebenbei verfasse. Ich hab' einfach nicht die Zeit, entsprechend ausführlich zu antworten und gib' einfach ein paar Hinweise die mir in diesem Fall weiterhelfen würden. Aus diesem Grund kommt es auch vor, dass ich schonmal einen Hinweis gebe, der schon gegeben wurde, weil ich auch nicht die Zeit habe, vollständige Threads zu lesen.

                Das kann ich gut verstehen, und im Prinzip genügen mir in der Regel auch Stichwörter. So habe ich Infos zu top nachgelesen und konnte sofort sehen, dass dies nichts anderes als MySQLs limit ist und somit vermeintlich (nach meinem falschen Gedankengang) nichts zur Lösung beiträgt.

                Die Abfrage, die ich dann sinnloserweise konstruierte, will ich nicht vorenthalten:

                select max(%s) from (select %s from %s as A1 limit 1,4) as A2

                Deswegen die Befürchtung um die Performanz.

                Ich betone immer wieder: wenn ich eine Frage stelle und ich so eine Antwort erhalte, bin ich heilfroh wenn die Antwort unmittelbar und "sofort" kommt, da ich dann sofort Stichworte für eine weitere Suche habe und sofort weiterarbeiten kann, ohne lange warten zu müssen. Mit den Stichworten findet man meistens irgendwo in den weiten des Internet irgendwelche Foren- oder Newsgroup-Einträge die diese Problematik beschreiben - oder eben gleich die richtige Stelle in der ggf. vorhandenen Dokumentation. Es hilft mir mehr, wenn jemand binnen 5 Minuten ein paar Stichworte oder Links hinknallt alswenn sich jemand 45 Minuten Zeit nimmt, um mir alles ausführlich zu erklären obwohl mir eigentlich nur irgend ein Stichwort entfallen ist oder mit irgend ein Funktionsname (noch) unbekannt ist.

                Ack. Eben deshalb hätte mir ein select id from table limit 4,1 schon geholfen. Ob dann noch ein order by nötig ist oder nicht (was es in disem Fall nicht ist, da MySQL die Daten ohne order by nach Eingabereihenfolge, also nach dem PK zurückgibt), wäre für einen grundsätzlichen Wegweiser irrelevant gewesen.

                Wie gesagt, ich stand auch unter Zeitdruck, weil das fertig werden musste, und habe die Kürze der Antwort nicht als wohlwollendes Mitdenken, sondern als Besserwisserei aufgefasst. Es war ein Missverständnis.

                Aber alles Schlechte hat immer auch was Gutes: So konnte ich das Problem nochmals reflektieren und habe mit top Bekanntschaft gemacht. Seitdem ich mit ORMs arbeite, komme ich nicht mehr so oft in direkten Kontakt mit SQL. Da sind, wenn dann noch Druck hinzukommt, manchmal die simpelsten Basics weg, die ich früher aus dem Effeff beherrschte.

                1. da MySQL die Daten ohne order by nach Eingabereihenfolge, also nach dem PK zurückgibt),

                  Darauf würde ich nicht zu viel wetten ;)

  2. moin,

    Mit welcher SQL-Abfrage lässt sich für das vierte Element die ID 8 ermitteln, also

    alte thematik, die trotzdem immer wieder gerne übersehen wird. mit TOP oder LIMIT mitteln kannst du nur arbeiten, wenn die sortierte spalte eindeutige werte hat oder es dir egal ist, wenn mehrere werte den gleichen inhalt haben können. ist keines der beiden fälle der fall,kannst es nicht mit LIMIT oder TOP lösen, sondern musst zu anderen mitteln (Unterabfragen mit aggregat-funktionen) greifen.

    Ilja

    1. moin,

      Mit welcher SQL-Abfrage lässt sich für das vierte Element die ID 8 ermitteln, also

      alte thematik, die trotzdem immer wieder gerne übersehen wird. mit TOP oder LIMIT mitteln kannst du nur arbeiten, wenn die sortierte spalte eindeutige werte hat oder es dir egal ist, wenn mehrere werte den gleichen inhalt haben können. ist keines der beiden fälle der fall,kannst es nicht mit LIMIT oder TOP lösen, sondern musst zu anderen mitteln (Unterabfragen mit aggregat-funktionen) greifen.

      Ilja

      In dem Fall war aber doch definiert, dass die Sortierung nach dem PK erfolgt, der eindeutig ist... Sonst müsste man halt ein order by und nötigenfalls Unterabfragen verwenden.

      1. moin,

        In dem Fall war aber doch definiert, dass die Sortierung nach dem PK erfolgt, der eindeutig ist... Sonst müsste man halt ein order by und nötigenfalls Unterabfragen verwenden.

        ich kann mich ja täuschen, aber hat die tabelle nicht zwei spalten, id und pk ?  wie auch immer, das wissen, wann es geht und wann nicht, kann nie schaden.

        Ilja

        1. moin,

          In dem Fall war aber doch definiert, dass die Sortierung nach dem PK erfolgt, der eindeutig ist... Sonst müsste man halt ein order by und nötigenfalls Unterabfragen verwenden.

          ich kann mich ja täuschen, aber hat die tabelle nicht zwei spalten, id und pk ?  wie auch immer, das wissen, wann es geht und wann nicht, kann nie schaden.

          Ilja

          Nein, es war ja nur zur Illustration eine ganz einfache Tabelle gewählt, die aus einem PK (primary key) id und einem weiteren wie auch immer benannten, abhängigen Attribut bestand. Und es sollte einfach nur die ID zum nten Element nach der Reihenfolge der vorkommenden IDs ermittelt werden.

          1. moin,

            Nein, es war ja nur zur Illustration eine ganz einfache Tabelle gewählt, die aus einem PK (primary key) id und einem weiteren wie auch immer benannten, abhängigen Attribut bestand.

            dann habe ich das missverstanden mit den jeweiligen spalten. wie aber bereits erwähnt, ist das wissen, dass das mit LIMIT/TOP nur unter diesen vorrausetzungen geht und auch dass es nicht dem ANSI SQL entspricht, was im falle eine migration nicht ganz unerheblich ist.

            Ilja