Упорядочивание по списку строк в Oracle SQL без LISTAGG

Я работаю с двумя объектами: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 )?

5
задан Curtis F. 18 July 2012 в 13:19
поделиться