DB2 SQL إضافة الصفوف استنادا إلى الصفوف الأخرى

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

  •  05-07-2019
  •  | 
  •  

سؤال

لقد حدد البيان الذي أريد أن تستخدم كأساس إضافة المزيد من الصفوف إلى جدول.الصفوف الجديدة سيكون لها بعض الأعمدة تعديل الأصلي الصف يجب أن يتغير أيضا.

هذا هو مرة واحدة قبالة التكرار و ديسيبل يمكن اتخاذها حاليا ما إذا كان ذلك يساعد.

أي أفكار ؟

شكرا جو

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

وصف التحديث

MBANK الجدول

  |منتصف |MAGN|MAAID|MTYPEOT| MAVAILS|MUSER|MTS
القديمة    |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 السجلات على اختيار.

حدد * من MDSTD.MBANK حيث MTYPEOT = '2' و MAVAILS = 'A'

هل كانت مفيدة؟

المحلول

DrJokepu الحل هو موافق ، ولكن هذا يعتمد على إذا ما تسميه "تغييرات" في سؤالك هو ثابت.I. e.:أنت دائما ما تغير +1 2 عمود ؟ أو هي تلك التغييرات "ديناميكية" في أن تقرر وقت التغييرات التي كنت تنوي تطبيق ؟

هناك في DB2 وغيرها من SQL أشكال مختلفة (مثل إدراج في DB2) أو حدد إلى 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 = العمر = O"

إن التغييرات "س", ثم كنت تريد حقا لتغيير الأصلي الصف ؟ الجواب على هذا السؤال يعتمد على نفس المهمة تريد تحقيقه ، الذي لا يزال غير واضح بالنسبة لي.

إذا كنت ترغب في تكرار الصفوف وتغيير "نسخ" أو نسخها و تغيير كل مجموعات (القديم و الجديد) ولكن باستخدام قواعد مختلفة.

التحديث بعد إعادة قراءة رسالتك فهمت أنك تريد أن تفعل هذا:

  1. تكرار مجموعة من السجلات (فعال نسخها) ولكن تعديل القيم.
  2. تعديل المجموعة الأصلية من الوثائق قبل يمكنك تكرار

إذا كان هذا هو الحال, أنا لا أعتقد أنك يمكن أن تفعل ذلك في "اثنين" استعلامات, لأنه سيكون لديك أي وسيلة لمعرفة ما هو الصف القديم و ما هو الجديد إذا كان لديك بالفعل تتكرر.

صالح خيار إنشاء جدول مؤقت ، نسخ الصفوف هناك (تعديل عليها كما "جديدة) مع الاستعلام لقد قدمت).ثم في الجدول الأصلي تنفيذ "تحديث" (باستخدام نفس WHERE للتأكد من أنك تعديل نفس الصفوف), تحديث "القديمة" القيم مع كل ما كنت ترغب في تحديث و أخيرا تضاف جديدة مرة أخرى إلى الجدول الأصلي (ما يسمى "الجديدة") التي عدلت بالفعل.وأخيرا إسقاط الجدول المؤقت.

تفو!

يبدو غريبا ولكن إلا إذا كنا نتحدث عن عدد مهول من السجلات في كل دقيقة ، يجب أن يكون هذا نوع من عملية سريعة.

نصائح أخرى

هل يمكن استخدام 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 يدعم عدة أوامر في دفعة واحدة، يمكنك دفعة معا:

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