2014-10-29 36 views
7

有誰知道Firebird 2.5是否具有類似於SQL中「STUFF」函數的功能? 我有一個包含父級用戶記錄的表和另一個包含與父級相關的子用戶記錄的表。我希望能夠拉取用戶擁有的「角色」的逗號分隔字符串,而不必使用第二個查詢,循環返回給定ID的值並自行創建字符串。Firebird 2.5 - 與SQL中的STUFF等效的函數(GROUP_CONCAT中的MySql/LISTAGG在Oracle中)

我已經查找過任何其他相關的問題,但還沒有找到。 在這個鏈接string equivalent of Sum to concatenate的問題基本上是我想要做的,但與Firebird 2.5數據庫。

回答

10

看起來你是幸運的 - 火鳥2.1具有LIST() aggregate function這在MySQL中,它允許查詢,像這樣的工作原理是GROUP_CONCAT

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

編輯,重新訂購

您可能在應用LIST聚合函數之前,可以通過預先排列派生表中的數據來影響排序,如下所示:

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

真棒!非常感謝StuartLC我不知道這個功能。完美地工作!只要它能讓我接受正確的答案。 – Phil 2014-10-29 16:24:13

+0

訂購過程如何?假設我按字母順序需要父母和孩子的名字,如果我添加「ORDER BY p.Name,c.Name)我得到這個錯誤:」ORDER BY子句中的表達式無效(不包含在聚合函數中或GROUP BY子句)「由於c.Name存在於order by子句中,有沒有辦法解決這個問題? – Bozzy 2016-02-05 11:52:41

+1

@Bozzy你可以通過在派生表中進行有序的預投影來影響排序我已經更新了答案。 – StuartLC 2016-02-09 17:57:03

相關問題