DB2 SQL добавляет строки на основе других строк

StackOverflow https://stackoverflow.com/questions/1410216

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть оператор select, который я хочу использовать в качестве основы для добавления дополнительных строк в таблицу.В новых строках будут изменены некоторые столбцы, и исходную строку также придется изменить.

Это одноразовое событие, и базу данных можно перевести в автономный режим, если это поможет.

Есть какие-нибудь идеи?

Спасибо, Джо

=================

Обновление описания

Таблица MBANK

        |MID |MAGN|MAAID|MTYPEOT| MAVAILS|MUSER|МТС
Старый    |65   |   9|    3|      2|              A|NAME |20090909
НОВОЕ    |65   |  10|    0|      2|              A|NAME |20090910
ИЗМЕНЕНИЕ |SAME |  +1| TO 0|   SAME|New = A Old = O|SAME |TIMESTAMP

Это нужно будет сделать примерно для 4000 записей в select.

выберите * из MDSTD.MBANK, где MTYPEOT = '2' и MAVAILS = 'A'

Это было полезно?

Решение

Решение DrJokepu в порядке, но это зависит от того, исправлено ли то, что вы называете "Изменениями" в вашем вопросе.То есть.:вы всегда собираетесь менять + 1 для 2-го столбца?Или эти изменения "динамичны" в том смысле, что вы должны решить во время выполнения, какие изменения вы собираетесь применить?

В DB2 и любом другом SQL существуют различные конструкции (например, insert into в DB2) или SELECT INTO для MS-SQL, которые позволят вам создать набор запросов.

Если я не ошибаюсь, вы хотите сделать это:

  1. Вставьте в таблицу некоторые значения, полученные из select (то, что вы называете "старым")
  2. Создайте другой набор записей (например, "старые"), но измените их значения.

Или, может быть, вы просто хотите сделать номер 2.

Номер 1 прост, как уже показал вам доктор Джокепу:

INSERT INTO <table> (values) SELECT "values" FROM <anotherTable>;

Номер 2 вы всегда можете выполнить в одном и том же запросе, добавляя изменения по мере выбора:

INSERT INTO MDSTD.MBANK ( MID, MAGN, MAAID, MTYPEOT, MAVAILS, MUSER, MTS)
SELECT 
      MID 
     ,MAGN + 1
     ,0 as MAAID
     ,MTYPEOT
     ,'A' as MAVAILS
     ,MUSER
     ,GETDATE() 
FROM mdstd.mbank 
WHERE MTYPEOT = '2' and MAVAILS = 'A'

(обратите внимание, что GETDATE() - это функция MS-SQL, на данный момент я не помню точную функцию для DB / 2).

Остается один вопрос, в вашем примере, который вы упомянули:

"Новый = A Старый = O"

Если Старое изменится на "O", то вы действительно хотите изменить исходную строку?ответ на этот вопрос зависит от конкретной задачи, которую вы хотите выполнить, которая мне все еще не ясна.

Если вы хотите дублировать строки и изменять "копии", или скопируйте их и измените оба набора (старый и новый), но используя разные правила.

Обновить Перечитав ваш пост, я понимаю, что вы хотите это сделать:

  1. Дублируйте набор записей (фактически копируя их), но изменяя их значения.
  2. Измените исходный набор записей до того , как вы продублировали их

Если это так, я не думаю, что вы сможете сделать это в "двух" запросах, потому что у вас не будет способа узнать, какая строка старая, а какая новая, если вы уже продублировали.

Допустимый вариант - создать временную таблицу, скопировать туда строки (изменить их как "новые") с помощью предоставленного мной запроса).Затем в исходной таблице выполните "update" (используя то же самое предложение WHERE, чтобы убедиться, что вы изменяете те же строки), обновите "старые" значения тем, что вы хотите обновить, и, наконец, вставьте новые значения обратно в исходную таблицу (то, что мы назвали "new"), которые уже изменены.Наконец, отбросьте временную таблицу.

Фух!

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

Другие советы

Вы могли бы использовать INSERT ...SELECT, который является специфичной для DB2 конструкцией:

INSERT INTO MY_TABLE (LOL, ROTFL, LONGCAT)
SELECT LOL, ROTFL, 'CUSTOM_VALUE'
FROM MY_TABLE
WHERE ID = 1337

А затем в той же транзакции вы выполняете обновление с тем же предложением where, если хотите изменить исходные строки:

UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337

Поскольку DB2 поддерживает несколько команд в одном пакете, вы можете пакетировать их вместе:

INSERT INTO MY_TABLE (LOL, ROTFL, LONGCAT)
SELECT LOL, ROTFL, 'CUSTOM_VALUE'
FROM MY_TABLE
WHERE ID = 1337;
UPDATE MY_TABLE
SET LOL = 9000
WHERE ID = 1337;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top