Я работаю с двумя объектами:Item
и Attribute
, которые выглядят примерно так:
Item
----
itemId
Attribute
---------
attributeId
name
Item
имеет 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
В настоящее время мы получаем одну строку данных на 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 )?