2014-10-29 24 views
7

Weiß jemand, ob Firebird 2.5 eine ähnliche Funktion wie die Funktion "STUFF" in SQL hat? Ich habe eine Tabelle, die übergeordnete Benutzerdatensätze enthält, und eine andere Tabelle, die untergeordnete Benutzerdatensätze enthält, die sich auf den übergeordneten Benutzer beziehen. Ich möchte in der Lage sein, eine kommagetrennte Zeichenfolge der "ROLES" zu ziehen, die der Benutzer hat, ohne eine zweite Abfrage zu verwenden, die Werte, die für die gegebene ID zurückgegeben werden, zu wiederholen und die Zeichenfolge selbst zu erstellen.Firebird 2.5 - Äquivalente Funktion zu STUFF in SQL (GROUP_CONCAT in MySql/LISTAGG in Oracle)

Ich habe nach anderen verwandten Fragen gesucht, aber keine gefunden. Die Frage in diesem Link string equivalent of Sum to concatenate ist im Grunde, was ich auch tun möchte, aber mit der Firebird 2.5 Datenbank.

Antwort

10

Es sieht aus wie Sie im Glück - Firebird 2.1 ein LIST() aggregate function hat, die wie GROUP_CONCAT in MySql arbeitet, die so eine Abfrage wie erlaubt:

SELECT p.Name, LIST(c.Name, ', ') 
FROM parent p INNER JOIN child c on c.parentid = p.parentid 
GROUP by p.Name; 

bearbeiten, re Bestellung

Sie können in der Lage sein, die Reihenfolge zu beeinflussen, indem die Daten in einer abgeleiteten Tabelle vor der Anwendung der LIST Aggregationsfunktion vorbestellt werden:

SELECT x.ParentName, LIST(x.ChildName, ', ') 
FROM 
(
    SELECT p.Name as ParentName, c.Name as ChildName 
    FROM parent p INNER JOIN child c on c.parentid = p.parentid 
    ORDER BY c.Name DESC 
) x 
GROUP by x.ParentName; 
+1

FANTASTISCH !!!! Vielen Dank StuartLC Ich war mir dieser Funktion nicht bewusst. Perfekt arbeiten! Wird als richtige Antwort akzeptieren, sobald es mich lässt. – Phil

+0

Was ist mit Bestellung? Nehmen wir an, ich brauche die Namen der Eltern und Kinder in alphabetischer Reihenfolge, wenn ich "ORDER BY p.Name, c.Name" hinzufüge, bekomme ich diesen Fehler: "Ungültiger Ausdruck in der ORDER BY-Klausel (nicht enthalten in einer Aggregatfunktion oder die GROUP BY-Klausel) "aufgrund der Anwesenheit von c.Name in der order by-Klausel. Gibt es eine Möglichkeit, dieses Problem zu lösen? – Bozzy

+1

@Bozzy können Sie möglicherweise beeinflussen, indem Sie eine geordnete Vorprojektion in einer abgeleiteten Tabelle tun Ich habe die Antwort aktualisiert. – StuartLC