Подтвердить что ты не робот

Есть ли запрос Oracle SQL, который объединяет несколько строк в одну строку?

У меня есть таблица, которая выглядит так:

A 1 
A 2 
B 1 
B 2

И я хочу создать набор результатов, который выглядит так:

A 1 2 
B 1 2

Есть ли инструкция SQL, которая будет делать это? Я использую Oracle.

Похожие вопросы:

4b9b3361

Ответ 1

Это зависит от версии Oracle, которую вы используете. Если он поддерживает функцию wm_concat(), вы можете просто сделать что-то вроде этого:

SELECT field1, wm_concat(field2) FROM YourTable GROUP BY field2;

wm_concat() в основном работает так же, как group_concat() в MySQL. Возможно, это не задокументировано, так что запустите старое sqlplus и посмотрите, есть ли там.

Если его там нет, тогда вы захотите реализовать что-то эквивалентное себе. Вы можете найти инструкции о том, как это сделать на странице странице агрегации строк на oracle-base.com.

Ответ 2

Довольно старая тема, но она может помочь другим, так как Oracle улучшилась в среднем.

Функция LISTAGG - это то, что вы ищете (по крайней мере в 11g)

Ответ 3

В Oracle 10g+:

SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        MODEL
        PARTITION BY
                (grouper)
        DIMENSION BY
                (ROW_NUMBER() OVER (PARTITION BY grouper ORDER BY id) AS rn)
        MEASURES
                (val, val AS group_concat, 0 AS mark)
        RULES SEQUENTIAL ORDER (
                group_concat[rn > 1] ORDER BY rn = group_concat[CV() - 1] || ', ' || val[CV()],
                mark[ANY] ORDER BY rn = PRESENTV(mark[CV() + 1], 0, 1)
                )
        )
WHERE   mark = 1
ORDER BY
        grouper

Смотрите эту статью в своем блоге для объяснений:

Ответ 4

Попробуйте что-то вроде:

SELECT
    field1,
    RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", field2) ORDER BY field2), '<x>'), '</x>', ' ')) AS field2s
  FROM yourTable
  GROUP BY field1

Свободно вдохновлен ответом найденным в этом форуме Oracle.

EDIT: это решение оказалось очень ресурсом, интенсивным с запросами, включающими в себя что-то вроде 10 5 строк. Я заменил это на пользовательские агрегированные функции как предложенные Джоном.

Ответ 5

Если у вас есть 10g, вам нужно пройти через следующую функцию:

CREATE OR REPLACE FUNCTION get_separated_value (input_val  in  number)
  RETURN VARCHAR2
IS
  return_text  VARCHAR2(10000) := NULL;
BEGIN
  FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP
    return_text := return_text || ' ' || x.col2 ;
  END LOOP;
  RETURN return_text;
END;
/

Итак, вы можете сделать так:

select col1, get_separated_value(col1) from table_name

Заклинание здесь

Если у вас есть оракул 11g, вы можете использовать listagg:

SELECT 
    age,
    LISTAGG(name, ' ') WITHIN GROUP (ORDER BY name) "names"
FROM table_x
GROUP BY age

Сценарий здесь для Listagg

Ответ 6

Пользовательские агрегированные функции: http://www.adp-gmbh.ch/ora/sql/user_def_agg.html

Просто скопируйте/вставьте и используйте его. Работает на 9i.

Ответ 7

SELECT a , COLLECT(b) FROM foo GROUP BY a

очень полезен при использовании в pl/sql - может быть отправлен в пользовательскую коллекцию.