2010-01-05 4 views
2

i essayé d'utiliser la requête suivante pour insérer des données dans une table et a une erreurInsérer une requête avec une sous-requête

insert into filmo_person_song (person_id, song_id, role_id) 
select person_id 
from filmo_person_song fps, filmo_song fs, filmo_role fr 
where fps.song_id = fs.song_id 
    and fps.role_id = fr.role_id 
    and fps.person_id = 43629; 

erreur 1136 (21S01): Nombre de colonnes ne compte correspond pas à la valeur à la ligne 1

i ont spécifié les champs exactement ..

Répondre

8

vous essayez d'insérer une valeur dans chaque ligne, mais vous avez spécifié trois colonnes à écrire à:

insert into filmo_person_song (person_id, song_id, role_id) 
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
select person_id 
     ^^^^^^^^^ 

Vous aurez besoin de lister les valeurs de toutes les trois colonnes de votre instruction select. Ce qui suit pourrait fonctionner:

insert into filmo_person_song (person_id, song_id, role_id) 
select fps.person_id, fs.song_id, fr.role_id 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
2

Vous ne sélectionnez person_id de la sous-requête, alors que vous avez spécifié person_id, song_id et role_id dans la clause d'insertion. Vous devez également sélectionner les champs manquants dans la sous-requête.

Vous voulez probablement quelque chose comme ceci:

INSERT INTO 
    filmo_person_song (person_id, song_id, role_id) 
SELECT 
    person_id, 
    song_id, 
    role_id 
FROM 
    filmo_person_song fps, filmo_song fs, filmo_role fr 
WHERE 
    fps.song_id = fs.song_id 
AND 
    fps.role_id = fr.role_id 
AND 
    fps.person_id = 43629; 
2

vous simplement spécifier un champ (select person_id) à insérer dans la table, alors que les spécifications de colonne indiquent que person_id, sond_idetrole_id sera inséré .

cela devrait fonctionner mieux:

insert into filmo_person_song (person_id, song_id, role_id) 
select person_id, fs.song_id, fr.role_id 
from filmo_person_song fps, filmo_song fs, filmo_role fr 
where fps.song_id = fs.song_id 
    and fps.role_id = fr.role_id 
    and fps.person_id = 43629; 
1

Modifier à:

insert into filmo_person_song (person_id, song_id, role_id) 
select person_id, fs.song_id, fr.role_id 
from filmo_person_song fps, filmo_song fs, filmo_role fr 
where fps.song_id = fs.song_id 
    and fps.role_id = fr.role_id 
    and fps.person_id = 43629; 
1

valeurs de retour de Subery doivent correspondre à la requête d'insertion comme ci-dessous.


insert into filmo_person_song (person_id, song_id, role_id) 
select person_id, song_id, role_id 
from filmo_person_song fps, filmo_song fs, filmo_role fr 
where fps.song_id = fs.song_id 
    and fps.role_id = fr.role_id 
    and fps.person_id = 43629; 
1

Vous demandez à ajouter des valeurs pour 3 colonnes (person_id, song_id, role_id), mais sont seulement fournirez 1:

person_id

Essayez:

insert into filmo_person_song (person_id) 
values (select person_id 
from filmo_person_song fps, filmo_song fs, filmo_role fr 
where fps.song_id = fs.song_id 
    and fps.role_id = fr.role_id 
    and fps.person_id = 43629); 

ou :

insert into filmo_person_song (person_id, song_id, role_id) 
values (
select person_id, song_id, role_id 
from filmo_person_song fps, filmo_song fs, filmo_role fr 
where fps.song_id = fs.song_id 
    and fps.role_id = fr.role_id 
    and fps.person_id = 43629); 
Questions connexes