DB2 INSERT INTO SELECT для копирования строк в одну таблицу без нескольких строк - PullRequest
0 голосов
/ 22 апреля 2020

Я искал ответ на этот вопрос в течение нескольких дней и не могу найти ничего, касающегося этой указанной c проблемы.

Прежде всего, должен ли он работать, если я хочу использовать оператор INSERT INTO SELECT для копирования строк таблицы обратно в ту же таблицу, но с измененными новыми идентификаторами и 1 столбца?

Пример:

INSERT INTO TABLE_A (column1, column2, column3) SELECT column1, 'value to change', column3 from TABLE_A where column 2 = 'original value';

Когда я пытаюсь это сделать в базе данных DB2 я получаю следующую ошибку:

НЕВЕРНАЯ ВСТАВКА НЕСКОЛЬКИХ СТРОК. SQLCODE = -533, SQLSTATE = 21501, DRIVER = 4.18.60

Если я выполняю тот же оператор, но я помещаю указанный c ID для возврата в оператор выбора, гарантируя, что только 1 строка будет вернулся, значит заявление работает. Но это противоречит тому, что я пытаюсь сделать: скопировать несколько строк из одной и той же таблицы в себя, обновляя указанный столбец c до нового значения.

Спасибо всем!

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

У меня отлично работает без ошибок на Db2 11.1.4.0

CREATE TABLE TABLE_A( column1 int , column2 varchar(16), column3 int)

INSERT INTO TABLE_A values (1,'original value',3)

INSERT INTO TABLE_A (column1, column2, column3)
SELECT column1, 'value to change', column3 from TABLE_A where column2 = 'original value'

SELECT * FROM TABLE_A

возвращает

COLUMN1|COLUMN2        |COLUMN3
-------|---------------|-------
      1|original value |      3
      1|value to change|      3

возможно есть что-то, о чем вы нам не говорите ....

0 голосов
/ 22 апреля 2020

Вы не упоминаете свою платформу и версию, но документы кажутся довольно ясными ..

IBM LUW 11.5

ВСТАВКА с несколькими строками недопустима в таблицу самообращения.

Первые результаты Google

Операция INSERT с вложенным выбором попыталась вставить несколько строк в себя -ссылочный стол. Подвыбор операции INSERT должен возвращать не более одной строки данных. Действия системы: Инструкция INSERT не может быть выполнена. Содержимое таблицы объектов не изменяется. Ответ программиста: Изучите условие поиска для подвыбора, чтобы убедиться, что выбрана не более одной строки данных.

РЕДАКТИРОВАТЬ Вы, по-видимому, получили ограничение на собственные ссылки на столе. Пример: таблица EMPLOYEES со столбцом MANAGER, определенным как FK, который сам ссылается на таблицу EMPLOYEES.

Db2 просто не поддерживает то, что вы пытаетесь сделать.

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

По желанию, если ваша таблица имеет первичный ключ, попробуйте вместо этого использовать оператор MERGE.

...