Как взять несколько строк и создать разделенный запятыми список в SQL - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть запрос, который я запустил:

SELECT * FROM rpg.class_primary_abilities AS cpab INNER JOIN rpg.abilities AS ab ON cpab.ability_id = ab.ability_id INNER JOIN rpg.classes AS cl ON cpab.class_id = cl.class_id;

Это дает мне следующий вывод.

enter image description here

Я хотел бы знать, как я могу изменить этот запрос, чтобы отображать все, кроме первого столбца class_id в списке через запятую. По сути, я хотел бы получить выходные данные class_id и value,value,value,value,value,value,value,value в качестве двух моих столбцов в выходных данных.

Я студент колледжа, который только учится SQL, и не подвергался каким-либо возможным решениям эта проблема в классе. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Пожалуйста, пометьте вашу базу данных для получения дополнительной информации.

Это один из способов для Oracle, где я использовал конкатенированный знак, который является || для конкатенации (соедините две строки в один) и между ними я также запятую ,. Вы также можете видеть, что я использовал двойные кавычки для столбца с именем desc. Я сделал это, потому что не рекомендуется называть ваши столбцы ключевыми словами, а слово desc используется, например, когда вы упорядочиваете по некоторому столбцу (в конце запроса), вы можете упорядочить по этому столбцу по возрастанию, а затем использовать asc или по убыванию, когда вы можете использовать desc. Также в обоих примерах я использовал ключевое слово as, чтобы дать имя этому объединенному столбцу.

SELECT class_id, cpab.ability_id || ',' || 
                 ab.ability_id  || ',' || 
                 ab.name || ',' || 
                 class_id || ',' ||  
                 cpab.name || ',' ||  
                 hit_die || ',' || 
                 "desc" || ',' || 
                 isPlayable as values
FROM rpg.class_primary_abilities AS cpab
INNER JOIN rpg.abilities AS ab ON cpab.ability_id = ab.ability_id
INNER JOIN rpg.classes AS cl ON cpab.class_id = cl.class_id;

Это другое для MYSQL, где я использовал concat для объединения значения столбца и я использовал разные одинарные кавычки для desc column.:

SELECT class_id, concat(cpab.ability_id, ',' , 
                        ab.ability_id, ',' ,
                        ab.name, ',' , 
                        class_id, ',' , 
                        cpab.name, ',' , 
                        hit_die, ',' , 
                        `desc`, ',' , 
                        isPlayable) as values
FROM rpg.class_primary_abilities AS cpab
INNER JOIN rpg.abilities AS ab ON cpab.ability_id = ab.ability_id
INNER JOIN rpg.classes AS cl ON cpab.class_id = cl.class_id;

В обоих примерах у вас есть столбцы с одинаковыми именами из разных таблиц, и вам придется использовать псевдонимы при вызове их в вашем выберите предложение, как я сделал в моем примере: cpab.ability_id и ab.ability_id, но, пожалуйста, обратите внимание, что я не знаю, если они из таблиц cpab и ab.

0 голосов
/ 12 февраля 2020

Большинство баз данных поддерживают такие функции, как string_agg() или listagg(), которые делают то, что вы хотите:

SELECT cl.class_id,
       STRING_AGG(ability_id, ',') as ability_ids,
       . . . 
FROM rpg.class_primary_abilities cpab JOIN
     rpg.abilities ab
     ON cpab.ability_id = ab.ability_id JOIN
     rpg.classes cl
     ON cpab.class_id = cl.class_id
GROUP BY cl.class_id
...