【问题标题】:Insert table rows based on concatenated rows from a series根据系列中的连接行插入表行
【发布时间】:2015-05-18 20:18:53
【问题描述】:

两个表,“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 语句中。

那么我如何使插入语句通过选择“循环”?

预期输出:

 id  |                         username                          |         email         
-----+-----------------------------------------------------------+-----------------------
  62 | Sam Jackson                                               | 1@infiniteglitch.net
  63 | (unknown person)                                          | 2@infiniteglitch.net
  64 | Howard Cocel J.                                           | 3@infiniteglitch.net

【问题讨论】:

  • 您能否将SELECT 部分的预期输出添加到问题中。

标签: sql postgresql generate-series


【解决方案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
); 

【讨论】:

    【解决方案2】:

    如果我很好理解您的问题,您需要以下查询。没有必要创建第二个查询,因为您在同一个表(轨道)和同一个用户 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; 
    

    【讨论】:

    • 那行不通,因为COUNT(filename) 最多只能获取一个(如果该艺术家有两个文件,则为两个)。如果我替换一个数字(如SELECT COUNT(filename) from tracks; 的结果,即24,它会为每个艺术家返回24 电子邮件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2013-12-03
    相关资源
    最近更新 更多