私は次のような 2 つのエンティティを使用しています:Item
と。Attribute
Item
----
itemId
Attribute
---------
attributeId
name
関連付けテーブルで指定されているItem
has :Attributes
ItemAttribute
--------------
itemId
attributeId
このデータがクライアントに到達するとItem
、 ごとに行が表示され、各行には のリストがAttribute
名前別に表示されます。例えば:
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
現在、1 行につき 1 行のデータを取得しています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
句は、ユーザー入力に基づいています。通常は 1 つの列であるため、順序付けは簡単です。結果セットを処理するアプリ側のループは、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) を使用して、この方法でデータをソートするクリーンで効率的な方法はありますか?