SQL View/Index sortieren

Die wilde Inge

Commander
Registriert
Aug. 2009
Beiträge
2.055
Hi,

ich verzweifel gerade daran die Ausgabe einer Suche absteigend zu sortieren.

Grundlage ist MSSQL. Im angeschlossenen Programm (=Webanwendung) wird mir das Ergebnis leider unvorteilhafterweise Aufsteigend angezeigt, ich hätte es aber gerne DESC.

Programm und DB sind nicht von mir, ich möchte es nur optimieren.

Folgender Code erzeugt den View und den Index.


SQL:
CREATE view "Test"."TicketSearch"  WITH SCHEMABINDING
as SELECT
    CAST(BASE.SEQUENCE as CHAR(50)) as  "Ticket ID",
    BASE.LASTMODIFIED as "LastModified",
    BASE.LASTUSER as "LastUser",
    BASE.NOTE as "Additional Information",
    BASE.DESCRIPTION as "Ticket Summary",  
    BASE."_INACTIVE_:" as "InActive",
    "J2"."SEQUENCE" as "Seq_TicketNotes",
    "J1"."SEQUENCE" as "Seq_ActivityCode",
    "J2"."NOTE" as "Ticket Notes",
    "J1"."_SYSTEM_" as "System Activity"
FROM
 "Test"."TELMASTE_" as BASE
 inner join "Test"."_TELDETAI_" as J2 ON J2."Problem #" = BASE."Sequence"
 inner join "Test"."_ACTIONS_" as J1 ON J1."SEQUENCE" = J2."ACTION"


 GO

CREATE UNIQUE Clustered INDEX PK_TicketSearch_ ON [Test].[TicketSearch] ([Seq_TicketNotes]) ON [PRIMARY];
GO
CREATE FULLTEXT INDEX ON [Test].[TicketSearch] ([Ticket ID],[Ticket Summary], [Additional Information] , [Ticket Notes]) KEY INDEX PK_TicketSearch_ ON TicketSearchCatalog;
GO

Den View zu sortieren gelingt mir nicht. Es gibt zwar viele Anleitungen aber die funktionieren alle nicht. Soll heißen ein ORDER BY am Ende weißt mir SSMS als invalide zurück, wenn ich nicht auch TOP/DOWN/OFFSET nutze (laut SSMS). Nutze ich dann TOP (SELECT TOP ....) motzt er, dass ich TOP nicht nehmen darf :hammer_alt:

Dann dachte ich, dass ich den Index vielleicht sotieren kann, aber egal wo ich ein DESC einbaue, es ist immer ein Syntaxfehler.

Wenn ich nachträglich in die DB gehe, mir den View angucke und dort die Sortier-Reihenfolge ändere funktioniert danach im Programm die Suche nicht mehr, weil diese angeblich plötzlich nicht mehr volltext indiziert wäre.

Mittlerweile bin ich völlig ideenlos.

Bitte Hilfe, ich will doch nur das Ergebnis anders sortiert haben :confused_alt:
 
Hi,
ich habe leider kein MSSQL Server zur Hand, aber geht es vielleicht so:

CREATE view "Test"."TicketSearch" WITH SCHEMABINDING
as
Select * from (
SELECT
CAST(BASE.SEQUENCE as CHAR(50)) as "Ticket ID",
BASE.LASTMODIFIED as "LastModified",
BASE.LASTUSER as "LastUser",
BASE.NOTE as "Additional Information",
BASE.DESCRIPTION as "Ticket Summary",
BASE."INACTIVE:" as "InActive",
"J2"."SEQUENCE" as "Seq_TicketNotes",
"J1"."SEQUENCE" as "Seq_ActivityCode",
"J2"."NOTE" as "Ticket Notes",
"J1"."SYSTEM" as "System Activity"
FROM
"Test"."TELMASTE_" as BASE
inner join "Test"."TELDETAI" as J2 ON J2."Problem #" = BASE."Sequence"
inner join "Test"."ACTIONS" as J1 ON J1."SEQUENCE" = J2."ACTION"
)
order by ___ desc
 
Scheint leider nicht zu klappen.
Syntax '*' is not allowed in schema-bound objects.
Wenn ich "as SELECT TOP 100 PERCENT from (" schreibe, markiert er mir FROM als Syntaxfehler und sagt
Invalid object name 'Test.TicketSearch'.
Und wenn ich im SELECT einfach die einzelnen Objekte aufzähle die es in der Tabelle gibt (statt "*"), geht auch nichts mehr
 
Das Sortieren einer View wird in MSSQL nicht unterstützt. Die von die angesprochenen Tricks werden vom Server einfach weg optimiert. Auch ein sortierter Index kann nicht immer funktionieren, je nachdem wie der Server die Abfrage optimiert.

Du könntest die View erstellen und eine sortierte Abfrage über eine SP realisieren. Was anderes ist dort nicht machbar.
 
Same applies to me, hab auch keinen MSSQL am Start...
Aber ich kann Dir aus der MySQL-Reference etwas zitieren:
Aus D.5. Restrictions on Views
Subqueries cannot be used in the FROM clause of a view.
und darunter
There is a general principle that you cannot modify a table and select from the same table in a subquery. See Section D.4, “Restrictions on Subqueries”.
Vermutlich ist es einfach so wie @SomeDifferent schreibt, jedenfalls empfehle ich Dir die Dokumentation des Servers gründlich zu lesen, das Verhalten sollte ordentlich beschrieben sein.
 
Ich fress ein Besen. Es muss doch möglich sein ganz schlicht und ergreifend die Ergebnisse in umgedrehter Reihenfolge anzuzeigen :freak:
 
Naja ich denke die Ergebnisse werden von einem Programmcode verarbeitet und in irgendeinem array/objekt, etc zwischen gepseichert.

Kannst du das sortieren?
 
Die Frage kann ich ehrlich gesagt nicht beantworten. Ich wäre jetzt davon ausgegangen dass der View das regelt. Wenn das Programm darauf noch mal ein Select machen würde, dann bräuchte ich doch den View nicht?
 
Soweit ich mich erinnern kann kann eine View nicht bereits in der Definition ordered werden weil das Result ja ein Table ist, der auch wie ein Table behandelt wird (SELECT, JOIN, APPLY). Davon abgesehen brauchst du ja ohnehin letztlich zumindest ein SELECT Statement auf die View (wie du selber festgestellt hast).
Tipp am Rande: Damit der Index einer indexed View auch genutzt wird brauchst du eim SELECT/JOIN der View die Query Hint WITH (NOEXPAND)
 
  • Gefällt mir
Reaktionen: Die wilde Inge
floq0r schrieb:
Soweit ich mich erinnern kann kann eine View nicht bereits in der Definition ordered werden weil das Result ja ein Table ist, der auch wie ein Table behandelt wird (SELECT, JOIN, APPLY). Davon abgesehen brauchst du ja ohnehin letztlich zumindest ein SELECT Statement auf die View (wie du selber festgestellt hast).
Tipp am Rande: Damit der Index einer indexed View auch genutzt wird brauchst du eim SELECT/JOIN der View die Query Hint WITH (NOEXPAND)
Danke für die Erläuterung, macht Sinn.
 
SP steht für Stored Procedure. Also eine gespeicherte Prozedur, die Logik ausführt und auch ein oder mehrere Ergebnisse zurück geben kann. Die solltest du aber nur nutzen, wenn du an vielen Stellen auf deine View zugreifst und überall eine bestimmte Sortierung benötigst UND dein verarbeitendes Programm die Handhabung von einer SP unterstützt.

Ansonsten würde ich es so machen wie vorgeschlagen und dein SELECT * FROM [VIEW] mit dem ORDER BY ergänzen - oder einfach die Daten von deinem Programm sortieren lassen, wenn möglich.
 
  • Gefällt mir
Reaktionen: Die wilde Inge
SomeDifferent schrieb:
SP steht für Stored Procedure. Also eine gespeicherte Prozedur, die Logik ausführt und auch ein oder mehrere Ergebnisse zurück geben kann. Die solltest du aber nur nutzen, wenn du an vielen Stellen auf deine View zugreifst und überall eine bestimmte Sortierung benötigst UND dein verarbeitendes Programm die Handhabung von einer SP unterstützt.

Ansonsten würde ich es so machen wie vorgeschlagen und dein SELECT * FROM [VIEW] mit dem ORDER BY ergänzen - oder einfach die Daten von deinem Programm sortieren lassen, wenn möglich.
Danke für die Erklärung.

Ich denke mein ganzer Thread beruhte auf einem Denkfehler. Ich war der Annahme, dass die Suchfunktion im Programm den View einfach nur anzeigt. Aber wie von euch gesagt findet hier eher ein SELECT auf den View statt. Mit der Erkenntnis hätte es mir sowieso nichts gebracht irgendwas zu sortieren.

Danke für die Aufklärung, ich mache mich jetzt auf die Suche wo genau ich das Select Statement im Programm finde.

VG
 
  • Gefällt mir
Reaktionen: SomeDifferent und BeBur
Zurück
Oben