Wie kann ich Ergebnisse aus einer Abfrage, die mehrere Zeilen in ein einzelnes Ergebnis zurückführt, "zusammenführen", "reduzieren" oder "pivotieren"?

8

Ich habe eine einfache Abfrage über eine Tabelle, die Ergebnisse wie folgt zurückgibt:

%Vor%

Und ich möchte die Ergebnisse in eine einzelne Zeile zusammenfassen, zum Beispiel:

%Vor%

Gibt es eine Möglichkeit, dies innerhalb eines Triggers zu tun?

NB: Ich weiß, dass ich einen Cursor verwenden kann, aber ich würde wirklich lieber nicht, es sei denn, es gibt keinen besseren Weg.

Die Datenbank ist Sybase Version 12.5.4.

    
dsm 31.05.2010, 11:24
quelle

7 Antworten

6

Da es in Sybase mit einer select-Anweisung ziemlich schwierig ist, dies zu tun, würde ich eine while -Schleife wie die folgende vorschlagen. While-Schleifen werden gegenüber Cursorn bevorzugt, da sie viel schneller sind. Angenommen, der Tabellenname lautet MYTABLE:

%Vor%

BEARBEITEN Die folgende Version ist ca. 45% schneller

%Vor%     
George Dontas 04.06.2010, 07:15
quelle
2

Ein anderer Ansatz, der auf Sybase ASE 12.5.4 funktioniert. Die Tabelle muss einen gruppierten Index für ID haben, damit dies funktioniert. Angenommen, der Tabellenname lautet MYTABLE:

%Vor%     
George Dontas 03.06.2010 12:16
quelle
2

Verwenden Sie die Funktion auf Zeilenebene.

Ihre Frage:

%Vor%

Funktion:

%Vor%     
Suresh 12.10.2011 06:24
quelle
1

Hier ist eine Lösung:

%Vor%

UPDATE: Ein anderer Ansatz

%Vor%     
Oleg I. 31.05.2010 11:47
quelle
1

Das Beste, was ich jetzt denken könnte, ist das nächste:

%Vor%

Aber das Ergebnis ist ein bisschen anders als das, das du eingegeben hast ... !!!

    
sgian76 03.06.2010 10:59
quelle
1

Ok, vergib mir, wenn ich etwas Wichtiges verpasse, weil ich das erste von Sybase nicht kenne. Aber in Mysql ist das absurd einfach, daher dachte ich, es könnte nicht so schlimm sein wie die Antworten bisher. Aus der Dokumentation, die relevant oder nicht relevant sein kann:

%Vor%

Bitte informieren Sie mich, wenn ich etwas falsch gelesen habe und ich lösche dies.

    
Rob Van Dam 05.06.2010 03:10
quelle
0

Ich habe keinen Sybase-Server zum Testen, aber wenn ich die Dokumente online lese, scheint es, dass allgemeine Tabellenausdrücke unterstützt werden. Ich war mir bezüglich ROW_NUMBER unsicher, wie es in anderen Lösungen verwendet wird, also hier ist eine Lösung, die das nicht verwendet.

Ich glaube, dass Sybase || verwendet für String-Verkettung, obwohl die Dokumente, die ich lese erwähnt, dass '+' kann auch verwendet werden, also habe ich das verwendet. Bitte ändern Sie es entsprechend.

Ich habe die Abfrage kommentiert, um zu erklären, was vor sich geht.

Die Abfrage verkettet alle id_type und id_ref-Werte mit der gleichen ID in der Reihenfolge 'id_type'.

%Vor%

Die Abfrage ist ziemlich "brutal", da sie keine komplexeren Funktionen verwendet, die die Lesbarkeit oder möglicherweise die Leistung verbessern könnten. Ich habe das gemacht, weil ich Sybase nicht gut kenne, und habe die Funktionen benutzt, von denen ich einigermaßen überzeugt bin, dass sie unterstützt werden. Für die beste Leistung werden die ID und (id, id_type) indiziert.

Um dies in einem Trigger zu verwenden, z. B. einen INSERT- oder UPDATE-Trigger, um eine Tabelle auf Basis dieser Concatentate-Abfrage zu verwalten, erweitern Sie die WHERE-Klausel des Basisfalls (vor UNION ALL) um id = @ changed_id. Dadurch wird sichergestellt, dass nur die verkettete Zeile für die geänderte ID berechnet wird. Sie können dann mit der berechneten verketteten Zeile machen, was Sie wollen. Wenn Sie die verkettete Abfrage für eine Tabelle materialisieren, DELETE die aktuelle verkettete Zeile für @changed_id in der Tabelle, und fügen Sie eine neue Zeile aus dem Ergebnis der oben genannten Abfrage ein. Sie können auch überprüfen, ob Ihre Verkettungstabelle bereits einen Wert mit der geänderten_ID enthält, und stattdessen eine UPDATE-Anweisung verwenden.

    
mdma 03.06.2010 21:34
quelle

Tags und Links