DB2 SQL добавляет строки на основе других строк - PullRequest
4 голосов
/ 11 сентября 2009

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

Это однократное событие, и БД можно отключить, если это поможет.

Есть идеи?

Спасибо, Джо

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

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

MBANK Table

<b>       |MID  |MAGN|MAAID|MTYPEOT|        MAVAILS|MUSER|MTS</b>
<b>OLD</b>    |65   |   9|    3|      2|              A|NAME |20090909
<b>NEW</b>    |65   |  10|    0|      2|              A|NAME |20090910
<b>CHANGE</b> |SAME |  +1| TO 0|   SAME|New = A Old = O|SAME |TIMESTAMP

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

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

Ответы [ 2 ]

4 голосов
/ 11 сентября 2009

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

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

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

  1. Вставьте некоторые значения в таблицу, которые происходят из выбора (что вы называете "старым")
  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).

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

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

Если Old изменится на «O», то вы действительно хотите изменить исходную строку? Ответ на этот вопрос зависит от того, какую именно задачу вы хотите выполнить, что мне до сих пор не ясно.

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

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

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

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

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

Уф!

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

2 голосов
/ 11 сентября 2009

Вы можете использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...