我正在使用两个实体:Item
和Attribute
,它们看起来如下所示:
Item
----
itemId
Attribute
---------
attributeId
name
一个Item
has Attributes
,在关联表中指定:
ItemAttribute
--------------
itemId
attributeId
当此数据到达客户端时,它将显示为每Item
行,每行将有一个Attribute
按名称列出的 s 列表。例如:
Item Attributes
---- ----------
1 A, B, C
2 A, C
3 A, B
用户可以选择对Attributes
列进行排序,因此我们需要能够按如下方式对数据进行排序:
Item Attributes
---- ----------
3 A, B
1 A, B, C
2 A, C
目前,我们每ItemAttribute
行获取一行数据。基本上:
SELECT Item.itemId,
Attribute.name
FROM Item
JOIN ItemAttribute
ON ItemAttribute.itemId = Item.itemId
JOIN Attribute
ON Attribute.attributeId = ItemAttribute.attributeId
ORDER BY Item.itemId;
这会产生如下结果:
itemId name
------ ----
1 A
1 B
1 C
2 A
2 C
3 A
3 B
实际ORDER BY
子句基于用户输入。它通常是单列,因此排序很简单,处理结果集的应用程序端循环将Attribute
名称组合成一个逗号分隔的列表,以便在客户端显示。但是当用户要求对该列表进行排序时,最好让 Oracle 对结果进行排序,这样——使用上面的示例——我们会得到:
itemId name
------ ----
3 A
3 B
1 A
1 B
1 C
2 A
2 C
oracle的LISTAGG
函数可以用来生成排序前的属性列表;然而Attribute.name
可以是一个很长的字符串,并且组合列表可能大于 4000 个字符,这会导致查询失败。
是否有一种干净、有效的方法可以使用 Oracle SQL (11gR2) 以这种方式对数据进行排序?