вставить запрос с подзапросом - PullRequest
2 голосов
/ 05 января 2010

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

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

я указал поля точно ..

Ответы [ 6 ]

8 голосов
/ 05 января 2010

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

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 голосов
/ 05 января 2010

вы просто указываете одно поле (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;
2 голосов
/ 05 января 2010

Вы выбираете только person_id из подзапроса, тогда как вы указали person_id, song_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;
1 голос
/ 05 января 2010

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

person_id

Попытка:

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);
1 голос
/ 05 января 2010

Возвращаемые значения 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 голос
/ 05 января 2010

Измените его на:

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