t.me/atinfo_chat Telegram группа по автоматизации тестирования

Запрос на создание одной строки из нескольких записей


(denisko.ua) #1

Есть следующие условия:

1) База Oracle (стандартный набор PL/SQL)

2) У пользователя есть права только на чтение

3) Есть таблица table_a

4) В ней есть N записей с 3мя колонками

{syntaxhighlighter brush: sql;fontsize: 100; first-line: 1; }select * from table_a{/syntaxhighlighter}

FirstName LastName City
Den Pupkin Kiev
Oleg Richy

Lviv

 

Задача:Написать такой select чтоб возвращал все записи из всех колонок в одной строке.

Например вот так: "Den Pupkin Kiev || Oleg Richy Lviv ||"


(Serge) #2

Самое простое будет типа:

select t.first_name ||' '|| t.Last_name ||' '|| m.first_name ||' '|| m.Last_name from users t, users m

Ну а дальше ставишь where, и другие украшения


(denisko.ua) #3

Да, но при таком запросе он выдаст несколько строк со слепленными вместе столбцами.

А вопрос - как слепить в одну строку несколько строк из результата?


(Serge) #4

В моем примере, если добавить WHERE с нужным критерием результатом будет 1 строка со слеплеными 2мя записями из таблицы, что и требовалось. Например,

select t.first_name ||' '|| t.Last_name ||' '|| m.first_name ||' '|| m.Last_name from users t, users m where t.last_name < m.last_name

(будет работать, если фамилии не одинаковы)

 

Если же нужно "слепить" произвольное количество записей, то не в курсе как это сделать на чистом SQL, если это вообще возможно


(denisko.ua) #5

 

Хм, да действительно, интересный вариант. Я так даже и не думал..

А если немного расширить задачу (см. обновлённые данные)

 


(Serge) #6

В PLSQL есть циклы, можно сделать многое. но я в нем 0


(denisko.ua) #7

Итак, после гуглевания я нашёл пару способов, опробовал их, подправил..

И вот что получилось:

{syntaxhighlighter brush: sql;fontsize: 100; first-line: 1; }SELECT sys_xmlagg(xmlelement(col, FirstName|| ' ' ||LastName|| ' ' ||City||' || ')).extract('//text()').getclobval() AS result FROM table_a ;{/syntaxhighlighter}

Use the dark XML power....


(Mykhailo Poliarush) #8

Интересно, а сколько это действие по времени занимает? Это наверное ресурсоемкая задача.