以下是一种使用递归公用表表达式的技术。不幸的是,我对它的表现没有信心。
我确定有很多方法可以改进这段代码,但它表明似乎没有一种简单的方法来使用SQL标准来完成这样的事情。
据我所见,真的应该有一种STRINGJOIN
聚合函数,将用于GROUP BY
。这将使这样的事情要容易得多......
这个查询假设有某种PersonID
连接两个关系,但Name
将工作太。
WITH cte (id, Name, Value, ValueCount) AS (
SELECT id,
Name,
CAST(Value AS VARCHAR(MAX)) AS Value,
1 AS ValueCount
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Name) AS id,
Name,
Value
FROM Person AS per
INNER JOIN Popularity AS pop
ON per.PersonID = pop.PersonID
) AS e
WHERE id = 1
UNION ALL
SELECT e.id,
e.Name,
cte.Value + ',' + CAST(e.Value AS VARCHAR(MAX)) AS Value,
cte.ValueCount + 1 AS ValueCount
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Name) AS id,
Name,
Value
FROM Person AS per
INNER JOIN Popularity AS pop
ON per.PersonID = pop.PersonID
) AS e
INNER JOIN cte
ON e.id = cte.id + 1
AND e.Name = cte.Name
)
SELECT p.Name, agg.Value
FROM Person p
LEFT JOIN (
SELECT Name, Value
FROM (
SELECT Name,
Value,
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY ValueCount DESC)AS id
FROM cte
) AS p
WHERE id = 1
) AS agg
ON p.Name = agg.Name
这是一个例子的结果:
--------------------------------
| Name | Value |
--------------------------------
| John Smith | 1.2,5,4.2 |
--------------------------------
| John Doe | NULL |
--------------------------------
| Jane Smith | 8 |
--------------------------------
不要以为你可以在纯SQL92实现它,而不诉诸供应商的特定技巧。想要一个仅有Oracle的解决方案? –
可能的重复[如何将多行组合到Oracle中的逗号分隔列表中?](http://stackoverflow.com/questions/468990/how-can-i-combine-multiple-rows-into-a-逗号分隔列表在oracle中) – dang
我想在Oracle中实现这一点,但是使用SQL标准操作。 –