运行sql查询后无法得到想要的结果。
作为一名学生,我正在研究 SQL 问题。我必须解决一个问题,那就是
“对于出现在古典播放列表中的作曲家,请创建相应(不同)播放列表名称的逗号分隔列表。”
预期的列名称:composer、list_of_playlists
我使用STRING_AGG()来解决POSTGRES SQL中的问题。
SELECT
t.composer,
STRING_AGG(p.name, ', ' ORDER BY p.playlist_id) AS list_of_playlists
FROM playlist_track AS pt
JOIN track AS t
ON pt.track_id = t.track_id
JOIN playlist AS p
ON pt.playlist_id = p.playlist_id
WHERE p.name LIKE '%Classical%' AND t.composer IS NOT NULL
GROUP BY t.composer
运行SQL查询后的结果如下:
| composer | list_of_playlists |
| | |
| Aaron Copland | Classical, Classical 101 - The Basics |
| Anonymous | Classical, Classical 101 - The Basics |
| Antonio Vivaldi | Classical, Classical 101 - The Basic |
| Astor Piazzola | Classical, Classical 101 - Deep Cuts |
| Bela Bartok | Classical, Classical 101 - Deep Cuts |
下面是由 Composer、PLAYLIST_ID 和 NAME 组成的表格的小示例
COMPOSER Playlist_id Name
Aaron Copland 12 Classical
Aaron Copland 15 Classical 101 - The Basics
Anonymous 12 Classical
Anonymous 15 Classical 101 - The Basics
Antonio Vivaldi 15 Classical 101 - The Basics
Antonio Vivaldi 12 Classical
Astor Piazzolla 13 Classical 101 - Deep Cuts
Astor Piazzolla 12 Classical
Béla Bartók 13 Classical 101 - Deep Cuts
Béla Bartók 12 Classical
我应该在 SQL 查询中进行哪些更改才能得到如下结果:
| composer | list_of_playlists |
| | |
| Aaron Copland | Classical, Classical 101 - The Basics |
| Anonymous | Classical, Classical 101 - The Basics |
| Antonio Vivaldi | Classical 101 - The Basic, Classical |
| Astor Piazzola | Classical 101 - Deep Cuts, Classical |
| Bela Bartok | Classical 101 - Deep Cuts, Classical |
对于所提供的数据,无法对查询进行任何实际更改来保证所需的列表顺序,因为没有合适的属性可供排序。按照评论之一的建议,从
ORDER BY
中删除 STRING_AGG
将产生一个列表,其顺序由表存储中行的排列决定,这不是可以直接控制的(也不是 playlist_id
和 name
都不会产生所需的顺序)。为了演示不使用 ORDER BY
时对检索顺序的依赖性,请创建一个表并插入两个值:
CREATE TABLE order_test (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
description TEXT
);
INSERT INTO
order_test (description)
VALUES
('first item'),
('second item');
跑步
SELECT
STRING_AGG(description, ', ')
FROM
order_test;
退货 |列表| |-| |第一项,第二项|
本次更新后
UPDATE order_test
SET
description = description
WHERE
description = 'first item';
运行
SELECT
查询返回
|列表|
|-|
|第二项,第一项|