2010-01-05 3 views
2

я пытался использовать следующий запрос, чтобы вставить данные в таблице и получил сообщение об ошибкевставка запрос с подзапросами

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; 

ОШИБКА 1136 (21S01): Количество столбцов не совпадает с количеством значений в строке 1

я определил поля точно ..

ответ

8

вы пытаетесь вставить один значения в каждой строке, но вы указали три колонок должны быть записаны:

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

Вам нужно будет указать значения для всех трех столбцов в инструкции выбора. Далее может работать:

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

Вы только выбрать person_id из подзапроса, в то время как вы определили person_idsong_id, и role_id в предложении вставки. Вы также должны выбрать недостающие поля в подзапросе.

Вы, вероятно, хотите что-то вроде этого:

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

вы просто указав одно поле (select person_id), чтобы вставить в таблицу, в то время как спецификации столбцов утверждают, что person_id, sond_idиrole_id будет вставлен ,

это должно работать лучше:

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

Изменить это:

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

возврата Subery значения должны совпадать со вставкой запроса, как показано ниже.


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

Вы просите его, чтобы добавить значения для 3-х столбцов (person_id, song_id, role_id), но только поставки 1:

person_id

Try:

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); 

или :

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); 
Смежные вопросы