MYSQL Использование множественного выбора в запросе вставки возвращает количество столбцов не соответствует значению в строке 1 - PullRequest
0 голосов
/ 15 ноября 2018

ОБНОВЛЕНИЕ

Иногда, когда семья инактивируется из системы, она может содержать более 1 человека.В моем случае, показанном на sql fiddle, в семье с доменным_идентификатором = 3 есть 3 человека.

Мне нужно вставить данные этих 3 человек как те же, что и из таблицы indiviudal в таблицу individual_history и простоизменив поле ind_action на следующее сообщение HH has been inactivated.

Вот пример данных:

| individual_id | household_id | family_relation_id | marital_status_id | ind_lmms_id | ind_un_id | head_of_hh | ind_first_name_ar | ind_last_name_ar | ind_first_name_en | ind_last_name_en | ind_gender |        dob | ind_status |       ind_date_added | user_id |          system_date |
|---------------|--------------|--------------------|-------------------|-------------|-----------|------------|-------------------|------------------|-------------------|------------------|------------|------------|------------|----------------------|---------|----------------------|
|             1 |           12 |                  3 |                 1 |         321 |    (null) |         no |                 u |                x |            (null) |           (null) |       Male | 2012-01-01 |     Active | 2018-07-19T00:00:00Z |       1 | 2018-07-19T00:00:00Z |
|             2 |           12 |                  1 |                 2 |         123 |    (null) |         no |                 x |                y |            (null) |           (null) |     Female | 1998-03-05 |     Active | 2015-03-05T00:00:00Z |       1 | 2015-03-05T00:00:00Z |
|             3 |           12 |                  3 |                 1 |        1234 |    (null) |         no |                 x |                z |            (null) |           (null) |     Female | 2004-04-05 |     Active | 2018-04-11T00:00:00Z |       1 | 2018-04-11T00:00:00Z |

Все 3 поля должны быть вставлены в таблицу individual_history и ind_action установлен на примечание, которое я добавил выше.

Мне нужно вставить в таблицу с именем individual_history значения запроса SELECT из таблицы individual.

Вот запрос:

INSERT INTO individual_history 
            (individual_id, 
             household_id, 
             family_relation_id_history, 
             marital_status_id_history, 
             ind_lmms_id_history, 
             ind_un_id_history, 
             head_of_hh_history, 
             ind_first_name_ar_history, 
             ind_last_name_ar_history, 
             ind_first_name_en_history, 
             ind_last_name_en_history, 
             ind_gender_history, 
             dob_history, 
             ind_status_history, 
             ind_action, 
             ind_date_changed, 
             user_id, 
             system_date) 
VALUES      ((SELECT i.individual_id, 
                     i.household_id, 
                     i.family_relation_id, 
                     i.marital_status_id, 
                     i.ind_lmms_id, 
                     i.ind_un_id, 
                     i.head_of_hh, 
                     i.ind_first_name_ar, 
                     i.ind_last_name_ar, 
                     i.ind_first_name_en, 
                     i.ind_last_name_en, 
                     i.ind_gender, 
                     i.dob, 
                     i.ind_status 
              FROM   individual i 
              WHERE  i.household_id = :hid), 
             'HH Status Changed to inactive', 
             (SELECT i.ind_date_added, 
                     i.user_id 
              FROM   individual i 
              WHERE  i.household_id = :hid), 
             :systemDate) 

Как вы можете видеть из запроса, я делю оператор SELECT на 2 части, так как я хочу вставить конкретное сообщение ind_action, затем я продолжу получать другие2 поля date added и user_id.

systemDate - это просто результат функции now().

Я попытался выполнить этот запрос, используя 12 как hid, и яполучил следующую ошибку:

1136 - количество столбцов не соответствует количеству значений в строке 1

После нескольких поисков я обнаружил, что мне нужно добавить скобки для каждого из значений.Поэтому я изменил запрос на:

INSERT INTO individual_history 
            (individual_id, 
             household_id, 
             family_relation_id_history, 
             marital_status_id_history, 
             ind_lmms_id_history, 
             ind_un_id_history, 
             head_of_hh_history, 
             ind_first_name_ar_history, 
             ind_last_name_ar_history, 
             ind_first_name_en_history, 
             ind_last_name_en_history, 
             ind_gender_history, 
             dob_history, 
             ind_status_history, 
             ind_action, 
             ind_date_changed, 
             user_id, 
             system_date) 
VALUES      ((SELECT i.individual_id, 
                     i.household_id, 
                     i.family_relation_id, 
                     i.marital_status_id, 
                     i.ind_lmms_id, 
                     i.ind_un_id, 
                     i.head_of_hh, 
                     i.ind_first_name_ar, 
                     i.ind_last_name_ar, 
                     i.ind_first_name_en, 
                     i.ind_last_name_en, 
                     i.ind_gender, 
                     i.dob, 
                     i.ind_status 
              FROM   individual i 
              WHERE  i.household_id = 12), 
             ( 'HH Status Changed to inactive' ), 
             (SELECT i.ind_date_added, 
                     i.user_id 
              FROM   individual i 
              WHERE  i.household_id = 12), 
             ( NOW() )) 

Но все равно получил ту же ошибку.

Я попытался подсчитать количество полей Я вставляю по сравнению с темиЯ выбираю, и они одинаковы (18 полей) .

ОБНОВЛЕНИЕ

Я изменил запрос, удалив предложение VALUES:

INSERT INTO individual_history 
            ( 
                        individual_id, 
                        household_id, 
                        family_relation_id_history, 
                        marital_status_id_history, 
                        ind_lmms_id_history, 
                        ind_un_id_history, 
                        head_of_hh_history, 
                        ind_first_name_ar_history, 
                        ind_last_name_ar_history, 
                        ind_first_name_en_history, 
                        ind_last_name_en_history, 
                        ind_gender_history, 
                        dob_history, 
                        ind_status_history, 
                        ind_action, 
                        ind_date_changed, 
                        user_id, 
                        system_date 
            ) 
SELECT i.individual_id, 
       i.household_id, 
       i.family_relation_id, 
       i.marital_status_id, 
       i.ind_lmms_id, 
       i.ind_un_id, 
       i.head_of_hh, 
       i.ind_first_name_ar, 
       i.ind_last_name_ar, 
       i.ind_first_name_en, 
       i.ind_last_name_en, 
       i.ind_gender, 
       i.dob, 
       i.ind_status 
FROM   individual i 
WHERE  i.household_id=12, 
       'HH Status Changed to inactive', 
       ( 
              SELECT i.ind_date_added, 
                     i.user_id 
              FROM   individual i 
              WHERE  i.household_id=12), 
       now()

И я получил следующую ошибку:

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

рядом с '' Статус HH изменен на неактивный '' в строке 10

Обратите внимание, что тип данныхполя одинаковы в обеих таблицах, и таблица individual_history содержит первичный ключ с автоинкрементом.

ЗДЕСЬ SQL FIDDLE для проверки с примерами данных.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

@ Мартинг Хеннингс, я немного опоздал ... но этот запрос должен работать:

INSERT INTO individual_history 
        (individual_id, 
         household_id, 
         family_relation_id_history, 
         marital_status_id_history, 
         ind_lmms_id_history, 
         ind_un_id_history, 
         head_of_hh_history, 
         ind_first_name_ar_history, 
         ind_last_name_ar_history, 
         ind_first_name_en_history, 
         ind_last_name_en_history, 
         ind_gender_history, 
         dob_history, 
         ind_status_history, 
         ind_action, 
         ind_date_changed, 
         user_id, 
         system_date)
  SELECT individual_id, 
         household_id, 
         family_relation_id, 
         marital_status_id, 
         ind_lmms_id, 
         ind_un_id, 
         head_of_hh, 
         ind_first_name_ar, 
         ind_last_name_ar, 
         ind_first_name_en, 
         ind_last_name_en, 
         ind_gender, 
         dob, 
         ind_status,
         'HH Status Changed to inactive',
         ind_date_added,
         user_id,
         now()
  FROM   individual
 WHERE   individual.household_id = 12
0 голосов
/ 15 ноября 2018

Вам не нужно два SELECT для того, что вы пытаетесь сделать.Если вы хотите использовать какое-то конкретное значение для ind_action, просто замените его в своем выборе, так же, как вы делали с функцией now():

INSERT INTO targetTable (col1, col2, col3, col4, colTime)
    SELECT colA, colB, 'my specific string', colD, now()
    FROM sourceTable WHERE colA = 12;

Здесь col3 получает строку, colTime now().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...