如何获取多行并在 SQL 中制作逗号分隔列表

How to take multiple rows and make a comma separated list in SQL

我有一个查询 运行

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;

它给了我下面的输出。

我想知道的是如何更改此查询以在逗号分隔列表中显示除第一个 class_id 列以外的所有内容。本质上,我想获得 class_idvalue,value,value,value,value,value,value,value 的输出作为我在输出中的两列。

我是一名刚刚学习SQL的大学生,在class中没有接触过任何可能解决这个问题的方法。感谢任何帮助。

大多数数据库都支持 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

请标记您的数据库以获取更多信息。

这是 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 使用了不同的单引号专栏:

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;

在这两个示例中,您都有来自不同表的同名列,并且在您的 select 子句中调用它们时必须使用别名,就像我在示例中所做的那样:cpab.ability_idab.ability_id 但请注意,我不知道它们是否来自 cpab 和 ab 表。