Autor Beitrag
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Do 07.06.12 09:46 
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.
ausblenden 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:
ausblenden 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?

_________________
Gruß
Christoph
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 07.06.12 10:17 
Hallo Christoph,

s. SQL: Was ist das Gegenteil von SELECT TOP?

Lösung also:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
SELECT *
FROM Marke
WHERE AUTOID NOT IN
      (SELECT TOP 10 AUTOID
       FROM Marke
       WHERE Name = 'Name'
       ORDER BY AUTOID DESC)
ORDER BY AUTOID DESC

(wenn ich mich jetzt nicht verschrieben habe)
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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:

_________________
Gruß
Christoph
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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 DESCAS 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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!

_________________
Gruß
Christoph