2015-03-16 1 views
0

Deux tables, 'user' et 'tracks' et je veux créer un utilisateur pour chaque piste qui n'en a pas déjà une (userid = 0).Insérer des lignes de tableau en fonction des lignes concaténées d'une série

Nous n'avons pas les e-mails uniques requis pour l'utilisateur visent donc à créer des e-mails factices en utilisant 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; 

Bien sûr obtenir l'erreur:

'ERROR: more than one row returned by a subquery used as an expression' 

je pourrais utiliser deux appels SQL et que le code parent (Python) exécute la boucle, mais j'imagine que la bonne façon de le faire est juste dans l'instruction SQL.

Alors, comment faire en sorte que l'instruction Insert sorte, 'loop' à travers le select?

Le résultat attendu:

id |       username       |   email   
-----+-----------------------------------------------------------+----------------------- 
    62 | Sam Jackson            | [email protected] 
    63 | (unknown person)           | [email protected] 
    64 | Howard Cocel J.           | [email protected] 
+1

Pourriez-vous ajouter à la question de la sortie attendue de la partie 'select'. –

+0

oui. bonne idée ... – MikeiLL

Répondre

1

Vous pouvez le faire avec row_number() fonction fenêtre:

INSERT INTO users (username, email) 
(SELECT artist, row_number() OVER() || '@domain.com'  
    FROM (SELECT artist 
    FROM tracks 
    WHERE userid = 0 
    GROUP BY artist) sq1 
); 
0

Si j'ai bien compris votre question, vous devez la requête suivante. Il n'est pas nécessaire de créer une deuxième requête car vous travaillez sur la même table (les pistes) et sur le même userid (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; 
+0

Cela ne marche pas tout à fait car COUNT (nom de fichier) n'obtient qu'un (ou deux) s'il y a deux fichiers pour cet artiste). Si je substitue un nombre (comme le résultat de 'SELECT COUNT (nom de fichier) des pistes;', qui est '24', il retourne' 24' emails pour chaque artiste. – MikeiLL