根据系列中的串联行插入 table 行
Insert table rows based on concatenated rows from a series
两个表,'user' 和 'tracks',我想为每个还没有用户的曲目创建一个用户 (userid=0)。
我们没有用户所需的唯一电子邮件,因此旨在使用 generate_series:
创建虚拟电子邮件
insert into users (username, email)
select artist, (
select concat(generate_series(1, (SELECT COUNT(filename)
FROM tracks where userid = 0)),'@domain.com')
) as email
from tracks
where userid = 0
group by artist;
当然会报错:
'ERROR: more than one row returned by a subquery used as an expression'
我可以使用两个 SQL 调用并让父代码 (Python) 执行循环,但我认为正确的方法是在 SQL 语句中.
那么如何使 Insert 语句变成 'loop' 通过 select?
预期输出:
id | username | email
-----+-----------------------------------------------------------+-----------------------
62 | Sam Jackson | 1@infiniteglitch.net
63 | (unknown person) | 2@infiniteglitch.net
64 | Howard Cocel J. | 3@infiniteglitch.net
如果我很清楚你的问题,你需要以下查询。没有必要创建第二个查询,因为您在相同的 table(轨道)和相同的用户 ID (0) 上操作。
insert into users (username, email)
select
artist,
concat(generate_series(1, COUNT(filename)),'@domain.com') as email
from tracks
where userid = 0
group by artist;
您可以使用 row_number()
window 函数来做到这一点:
INSERT INTO users (username, email)
(SELECT artist, row_number() OVER () || '@domain.com'
FROM (SELECT artist
FROM tracks
WHERE userid = 0
GROUP BY artist) sq1
);
两个表,'user' 和 'tracks',我想为每个还没有用户的曲目创建一个用户 (userid=0)。
我们没有用户所需的唯一电子邮件,因此旨在使用 generate_series:
创建虚拟电子邮件insert into users (username, email)
select artist, (
select concat(generate_series(1, (SELECT COUNT(filename)
FROM tracks where userid = 0)),'@domain.com')
) as email
from tracks
where userid = 0
group by artist;
当然会报错:
'ERROR: more than one row returned by a subquery used as an expression'
我可以使用两个 SQL 调用并让父代码 (Python) 执行循环,但我认为正确的方法是在 SQL 语句中.
那么如何使 Insert 语句变成 'loop' 通过 select?
预期输出:
id | username | email
-----+-----------------------------------------------------------+-----------------------
62 | Sam Jackson | 1@infiniteglitch.net
63 | (unknown person) | 2@infiniteglitch.net
64 | Howard Cocel J. | 3@infiniteglitch.net
如果我很清楚你的问题,你需要以下查询。没有必要创建第二个查询,因为您在相同的 table(轨道)和相同的用户 ID (0) 上操作。
insert into users (username, email)
select
artist,
concat(generate_series(1, COUNT(filename)),'@domain.com') as email
from tracks
where userid = 0
group by artist;
您可以使用 row_number()
window 函数来做到这一点:
INSERT INTO users (username, email)
(SELECT artist, row_number() OVER () || '@domain.com'
FROM (SELECT artist
FROM tracks
WHERE userid = 0
GROUP BY artist) sq1
);