两个表,'用户'和'曲目',我想为每个没有一个(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语句中。
那么如何通过select?
使Insert语句排序'循环'预期产出:
id | username | email
-----+-----------------------------------------------------------+-----------------------
62 | Sam Jackson | 1@infiniteglitch.net
63 | (unknown person) | 2@infiniteglitch.net
64 | Howard Cocel J. | 3@infiniteglitch.net
答案 0 :(得分:1)
您可以使用row_number()
窗口函数执行此操作:
INSERT INTO users (username, email)
(SELECT artist, row_number() OVER () || '@domain.com'
FROM (SELECT artist
FROM tracks
WHERE userid = 0
GROUP BY artist) sq1
);
答案 1 :(得分:0)
如果我很好理解您的问题,您需要以下查询。没有必要创建第二个查询,因为您在同一个表(轨道)和同一个用户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;