如何获取多行并在 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_id
和 value,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_id
和ab.ability_id
但请注意,我不知道它们是否来自 cpab 和 ab 表。
我有一个查询 运行
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_id
和 value,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_id
和ab.ability_id
但请注意,我不知道它们是否来自 cpab 和 ab 表。