0

'user' と 'tracks' の 2 つのテーブルがあり、まだ 1 つも持っていない (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'

2 つの SQL 呼び出しを使用して、親コード (Python) にループを実行させることもできますが、それを行う正しい方法は SQL ステートメント内だけだと思います。

では、どうすれば Insert ステートメントを select を「ループ」させることができるでしょうか?

期待される出力:

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

2 に答える 2

0

私があなたの質問をよく理解していれば、次のクエリが必要です。同じテーブル (トラック) と同じユーザー ID (0) を操作するため、2 番目のクエリを作成する必要はありません。

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; 
于 2015-03-16T16:47:08.503 に答える