Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - SELECT TOP umkehren?
Christoph1972 - Do 07.06.12 09:46
Titel: SELECT TOP umkehren?
Hallo Leute,
ich glaub ich habe ein Brett vorm Kopf…
Also, ich möchte aus einer Tabelle (SQL-Server) die letzten 10 Datensätze holen. Dazu habe ich mir den TOP * Command rausgesucht. Dieser holt jedoch die ältesten 10 aus der Tabelle. Gut, die Tabelle habe ich mit ORDER BY umgekehrt, somit habe ich die letzten 10, aber leider in umgekehrter Reihenfolge. Ich müsste meine Selection jetzt wieder mit ORDER BY umkehren, nur das bekomme ich gerade nicht hin. Klar, mein ADO.Net DataTable könne ich neu sortieren, das wäre kein Problem und meine Aufgabe wäre gelöst. Aber ich möchte das der Server diese Aufgabe für mich erledigt!
Hier mein SQL Ansatz:
Hier die neusten 10, jedoch in falscher Reihenfolge.
SQL-Anweisung
1: 2: 3: 4:
| SELECT TOP 10 * FROM Marke WHERE Name = 'Name' ORDER BY AUTOID DESC |
Jetzt würde ich in etwa sowas benötigen:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8:
| SELECT FROM
(SELECT TOP 10 * FROM Marke WHERE Name = 'Name' ORDER BY AUTOID DESC)
ORDER BY AUTOID ASC |
Leider funktioniert meine Idee nicht. Ich denke meine Aufgabenstellung sollte eigentlich easy sein, oder?
Wie kann/sollte ich hier vorgehen?
Christoph1972 - Do 07.06.12 13:20
Vielen Dank schon mal! Also den Link hatte ich auch gefunden, jedoch bin ich damit nicht zu dem gewünschten Ergebnis gekommen. Auch dein Vorschlag haut nicht hin, es werden alle Datensätze ausgegeben die in der Tabelle sind. Ehrlich gesagt verstehe ich auch nicht wie der Befehl funktionieren soll, mir ist nicht klar was das NOT IN bewirken soll :nixweiss:
Ralf Jansen - Do 07.06.12 14:32
Deine ursprüngliche Idee war schon nicht so schlecht du musst sie nur zu Ende bringen. Heißt Dein Subselect denn du wie eine Tabelle benutzt muss auch einen Namen haben sonst ist der ja nicht ansprechbar auch wenn der Name dann im folgenden nicht konkret benutzt wird.
SQL-Anweisung
1: 2: 3: 4: 5: 6:
| SELECT AutoId, Name FROM (SELECT TOP (5) AutoId, Name FROM Marke WHERE Name = 'Name' ORDER BY AutoId DESC) AS A ORDER BY AutoId |
Zitat: |
mir ist nicht klar was das NOT IN bewirken soll |
Es sorgt dafür das du alles was nicht in den neuesten 10 ist bekommst. Nicht ganz was du willst,wenn ich dich richtig verstanden habe. Könnte das richtige liefern wenn du mal das NOT wegläut.
Wenn beides geht und das Performance kritisch ist könntest du beide Versionen mal im Performance Monitor des Management Studios gegeneinander antreten lassen.
Th69 - Do 07.06.12 15:17
Hallo,
ihr habt Recht, das
NOT ist falsch (auf der angegeben Seite sollten ja alle restlichen Daten archiviert werden, außer den 3 ersten).
Und ich sehe gerade, daß ich die äußere
ORDER BY auch falsch abgeschrieben habe.
Hier also neuer Lösungsversuch:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8:
| SELECT * FROM Marke WHERE AUTOID IN (SELECT TOP 10 AUTOID FROM Marke WHERE Name = 'Name' ORDER BY AUTOID DESC) ORDER BY AUTOID ASC |
Christoph1972 - Do 07.06.12 17:57
Schön das meine Idee gar nicht so abwegig war. Jetzt wo der Code steht, ist es doch eine simple Sache, ich bin einfach nicht drauf gekommen, na ja, das war mir ja schon klar.
Jetzt muss ich mich nur noch für eine der beiden Versionen entscheiden :-)
Wo gibt es den einen Performance Monitor? Ich habe nur die Express Version und kenne diesen nicht.
Also, vielen Dank euch beiden!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!