2009-09-11 2 views
3

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

Это случайная ситуация, и БД можно отключить, если это помогает.

Любые идеи?

Спасибо, Джо

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

Описание Обновить

MBANK Таблица

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

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

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

+0

Не могли бы вы объяснить свою идею немного больше? Небольшой образец поможет. Вы можете использовать SELECT INTO (и формировать свой выбор/в соответствии с вашими пожеланиями), но если вам нужно изменить «оригинальную» таблицу, вам понадобится хранимая процедура в DB2. –

ответ

3

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

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

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

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

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

номер 1 легко, как докторJokepu уже показал вам:

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

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

«New = A Старый = O»

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

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

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

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

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

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

Уф!

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

2

Вы можете использовать INSERT ... SELECT, который является 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 

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

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; 
+1

ОП не говорит, что старые и новые строки могут быть идентифицированы по идентификатору, поэтому у него не будет возможности обновить «исходный набор», если одно и то же предложение WHERE возвращает те же строки (плюс новые вставленные). –

Смежные вопросы