Zeigen ein eins-zu-viele-Beziehung, die als 2-Spalten - 1 Datensatz (ID & Komma getrennte Liste)
Ich brauche etwas ähnliches für diese 2 Fragen, aber mit Informix-SQL-syntax.
Meine Daten zu kommen sieht so aus:
id codes
63592 PELL
58640 SUBL
58640 USBL
73571 PELL
73571 USBL
73571 SUBL
Ich möchte sehen, Sie kommen zurück wie diese:
id codes
63592 PELL
58640 SUBL, USBL
73571 PELL, USBL, SUBL
Siehe auch group_concat() in Informix.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass die Antwort, die Sie brauchen ist ein benutzerdefiniertes Aggregat, ähnlich wie diese:
Tabelle der Elemente (Elemente genannt) mit einer Spalte namens name, der (komischerweise) den Namen des Elements, und eine weitere Spalte mit der Bezeichnung atomic_number, diese Abfrage führt zu diesem Ergebnis:
Angewandt, um die Frage, sollten Sie erhalten die Antwort die Sie benötigen, aus:
Die Ausgabe ist:
Den zusätzlichen Satz von Daten wurde Hinzugefügt, um zu testen, ob insert-Sequenz beeinträchtigt das Ergebnis; es scheint nicht zu tun (die codes sind in der Reihenfolge sortiert; ich bin mir nicht sicher, ob es einen Weg gibt, zu verändern umgekehrte Reihenfolge).
Hinweise:
LVARCHAR(10240)
(10 KiB), zum Beispiel.SQL -528: Maximum output rowsize (32767) exceeded
, das wundert mich.Wenn Sie entfernen müssen die aggregate, die Sie verwenden können:
order by id, codes
? oderorder by id, case codes when 'PELL' then 1 when 'USBL' then 2 else 3 end;
? Sie müssen nicht alles tun, was mit AggregatfunktionenSELECT id, group_concat(codes) FROM anonymous_table GROUP BY id ORDER BY id, codes
erhalten Sie-19828: ORDER BY column or expression must be in SELECT list in this context
. Wenn Sie hinzufügencodes
zu der GRUPPE DURCH, erhalten Sie eine Zeile in jede Gruppe. Wenn Sie versuchen, hinzufügencodes
zu der select-Liste, Sie bekommen gesagt-294: The column (codes) must be in the GROUP BY list
, und wenn Sie zu beheben, erhalten Sie das falsche Ergebnis wieder. Also, insgesamt ist die Antwort: Nein.partial1
oderpartial2
oder beide leer sind strings, oder sind Sie besorgt über NULL, oder beides? Wenn eine NULL gefunden wurde, dann ist die||
- Betreiber erzeugen eine null. Für die anderen Fälle, wenn der eine oder andere Zweig von mehreren parallelen Zweigen erzeugt ein leeres Ergebnis, nehme ich angc_comb
könnte dazu aufgerufen werden, kombinieren Sie eine oder zwei leere Ergebnisse. Zum Teil ist eine variation des Problems identifiziert, die von RET in einer früheren comment.collection
zum speichern der Zwischenwerte?gc_comb()
Betrieb; es wird vielleicht ein 'merge' ist eher als einfache Verkettung, und ditogc_fini()
. Ich bin mir nicht sicher, welche Kollektion am besten funktioniert in diesem Zusammenhang — und das könnte Auswirkungen auf die Kosten der Verschmelzung. Mit allen Mitteln gehen Sie vor und schreiben Sie, wie eine Gruppe miteinander verketten, aber ich fürchte, es wird nicht trivial sein.SET
. Es ist langsamer als erwartet, aber es verbraucht auch viel mehr Speicher (2 Größenordnung höher auf meiner tests). Also vielleicht auch nicht wirklich praktisch.BSON
, zu eurer Belustigung und Entsetzen.Ich bin mir nicht sicher, informix sql, aber in MSSQL oder Oracle, man könnte dies mit der
DECODE oder CASE-Schlüsselwörter, indem Sie Sie zusammen. Dies würde jedoch erfordern, dass Sie wissen, alle möglichen Werte vor der Zeit, die spröde ist.
Ich gehe davon aus, dass der Grund, warum Sie nicht wie das ZEUG Schlüsselwort ist, weil informix nicht unterstützt?
Oracle unterstützt auch das VERBINDEN VON Schlüsselwörtern, die funktionieren würde, aber wieder, können nicht unterstützt werden von informix.
Wahrscheinlich die beste Antwort wäre der Aufbau dieser Ausgabe in Ihre client - /Daten-Schicht, nach der Abfrage. Gibt es einen bestimmten Grund, warum dies getan werden muss in der Abfrage?
Auch, wenn informix ermöglicht Ihnen das erstellen von Benutzer-Funktionen, könnte man eine Funktion erstellen, die zurückgegeben wird ein string mit dem verketteten Wert.
Gebäude auf Jonathan Leffler Beispiel, und auf RET get Kommentare über die Reihenfolge der verketteten Werte, mit Hilfe des Informix 12.10FC8DE, ich kam mit der folgenden Benutzer-Aggregat:
Verkettete Werte wird keine Duplikate haben und bestellt werden.
Ich verwendet, Informix
collections
nämlichSET
nicht zulassen doppelte Werte, um zu versuchen, um den code etwas einfacher.Methode ist die Verwendung
SET
's behalten der Zwischenergebnisse (und die Beseitigung der Duplikate) und am Ende bauen die verkettete Zeichenfolge von der bestellten Werte der letztenSET
.Den Einsatz von
LVARCHAR
für dieSET
Elemente ist aufgrund der Tatsache, dass ich anfangs war mitVARCHAR
aber der Speicherbedarf war sehr, sehr hoch. In der Dokumentation Hinweise darauf, dass intern Informix kann Gießen dieVARCHAR
zuCHAR
. Ich habe die änderung vorgenommen und es hat in der Tat senken Sie den Speicherbedarf (es ist aber immer noch hoch).Jedoch, dieses Aggregat Speicher Verbrauch ist um 2 Größenordnungen höher als Jonathan und etwa 2 mal langsamer auf die tests habe ich (mit einer Tabelle mit rund 300 000 Zeilen).
So nutzen Sie mit Sorgfalt. Es verbraucht eine Menge Speicher, und es ist nicht ausgiebig getestet ( es kann sein, Speicherbereiche irgendwo ).
EDIT 1:
Meinen bisherigen code muss undichten eine Speicher-Struktur irgendwo (oder intern Informix hält die Sammlung der abgeleiteten Tabellen um, und kann es generiert eine Menge von diesen).
So, immer noch versuchen, zu vermeiden, dass code der Aggregat-Funktion in
C
, hier ist eine weitere alternative, mit InformixBSON
integrierten Funktionen, verwenden viel weniger Speicher und etwas schneller.Den aggregierten Wert der bestellten entspricht und ohne Duplikate.
Wieder, das war nicht richtig getestet. Es ist nur ein POC.
Eines der Probleme ist, dass es nicht bereinigen die input-Werte.
Einige der
BSON
Manipulation Funktionen erhalten Parameter, die gebaut werden, die durch verketten von Zeichenfolgen und nicht escaped Zeichen können brechen diese Parameter.Zum Beispiel, eine Zeichenfolge mit Anführungszeichen auf Sie:
'I"BrokeIt'
) hervorrufen können, ein Sortiment von Fehler (Assert-Fehler enthalten).Und ich bin mir sicher es gibt andere Probleme.
Jedoch, der Speicherverbrauch dieser Implementierung ist in der gleichen Größenordnung wie in Jonathan B. und um 60% langsamer (auch hier nur sehr rudimentäre Tests durchgeführt).
Ich möchte an dieser Stelle diese Antwort auf eine ähnliche Frage auf Stack Overflow. Sie suchen nach etwas, wie MySQL die
group_concat()
Funktion.