إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

اريد عمل update لبيانات الجدول الثاني .. على حسب الناتج من الجدول الاول


6 رد (ردود) على هذا الموضوع

#1 Yousef_Elkordi

Yousef_Elkordi

    عضو

  • الأعضــاء
  • 20 مشاركة

تاريخ المشاركة 12 May 2009 - 02:38 PM

السلام عليكم

اخواني .. لدي DB بهال 2 tabels الجدول الاول فية بيانات العملاء و ارقامهم .. وقمت بإستخراج كمية من البيانات من الجدول الاول ( 50 اسم ) .. عن طريق كويري .. و لم احفظها باي جدول جديد

ولدي الجدول الثاني فية ايضا بيانات العملاء و ارقامهم ...
الان المشكلة اني اريد ان اعدل بيانات الجدول الثاني ...اي ان اقوم بعمل update لبيانات الجدول الثاني .. على حسب الناتج من الجدول الاول

فارجو الاجابة باسرع وقت ممكن
ولكم جزيل الشكر

#2 MMA

MMA

    مشرف سابق وعضو مميز

  • المجموعة الماسية
  • 1,019 مشاركة
  • الاسم الأول:Mostapha
  • اسم العائلة:Abd El-Salam
  • البـلـد: Country Flag
  • المنصب الحالي:المؤسسة المصرية لتبسيط العلوم - عضو مؤسس - مستشار تقني

تاريخ المشاركة 12 May 2009 - 10:42 PM

بص يا أخير حسب ، يمكنك عمل Delete لكافة السجلات الموجودة في الجدول الثاني ومن ثم تدرج من جديد البيانات المرتجعة في الإستعلام كما يلي :

Begin
   Delete From Table2;
   Insert Into Table2(Field1, Field2, Field3)  Select Field1,Field2,Field3 From Table1 Where Field1 <= 50;
   Commit;
End;
/

أو يمكنك عمل Cursor ثم تعمل Loop علي كافة السجلات المرتجعة ، ومن ثم تشوف إن كان السجل موجود أم لا ، لو مش موجود تعمل له Insert ولو موجود تعمل له Update



بالتوفيق

مهندس/ مصطفي محمود عبد السلام   
العضو المؤسس بالمؤسسة المصرية لتبسيط العلوم
والمستشار التقني

(برمجيات - نظم معلومات - شبكات)

.

 

( 01098570165 )

.

.

.

( MMA_Programmer@Yahoo.com )

 


#3 Yousef_Elkordi

Yousef_Elkordi

    عضو

  • الأعضــاء
  • 20 مشاركة

تاريخ المشاركة 13 May 2009 - 12:11 AM

شكرا اخي الكريم .. و لكن اتمنى ان تفيدني اكثر ... لاني اتحدث على مستوى ال sql وليس ال pl\sql
ولك جزيل الشكر

#4 Yousef_Elkordi

Yousef_Elkordi

    عضو

  • الأعضــاء
  • 20 مشاركة

تاريخ المشاركة 13 May 2009 - 01:17 AM

للتوضيح ... انا لا اريد ان اعمل دليت لاي شي من البيانات من الجدول الثاني .. انا اريد تحديث بعض البيانات من الجدول الثاني ببيانات من الجدول الاول
مثال :

table 1
----------------------------------------------------------------
cust_code - cust name - loc
----------------------------------------------------------------
c200 - Salim - Egypt
c400 - Marwan - UK
c600 - Yousef - USA
c500 - Ali - Amman

و الجدول الثاني فية نفس الحقول بس فيهم كمان شوي زيادات .. مثل العمر و العمل و هكذا
و بعض البيانات مختلفة .

table 2
---------------------------------------------------------------------------------
cust_code - Age - cust name - loc
---------------------------------------------------------------------------------
c200 - 22 - Salim - Egypt
c400 - 25 - Marwan - Yaman
c600 - 35 - Yousef - Kuwait
c500 - 30 - Ali - Amman

لان لو تلاحظو ... الاسمين yousef و marwan بالجدول الاول فيهم ال location مختلف عن بعض ....

الان .. انا قمت بكتابة كويري ... قمت عن طريقها باخراج البيانات المختلفة من الجدول الاول ... و اريد فقط تبديل هذة البيانات المختلفة من الجدول الاول .. بالجدول الثاني .. فما هو الحل ...!!!

#5 tanbet

tanbet

    عضو

  • الأعضــاء
  • 43 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 13 May 2009 - 09:09 AM

عليك بالmerge أخي الكريم وهي من ضمن جمل ال sql في أوراكل

ولا أريد أطيل فهذا مثال على استخدام الmerge

merge [ hints ] into table-name-1 | view-name-1 [ alias-1 ]
using table-name-2 | view-name-2 | subquery [ alias-2 ] on ( condition )
[ merge-update-clause ] [ merge-insert-clause ] [ error-logging-clause ];
create table table_dest (
id number primary key,
txt varchar2(20)
);

insert into table_dest values (1,'one');
insert into table_dest values (3,'three');
insert into table_dest values (5,'five');

commit;
create table table_source (
id number primary key,
txt varchar2(20)
);

insert into table_source values (2,'TWO');
insert into table_source values (3,'THREE');

commit;
merge into table_dest d
using
table_source s on (s.id = d.id)
when matched then update set d.txt = s.txt
when not matched then insert (id, txt) values (s.id, s.txt);
select * from table_dest; ID TXT
---------- --------------------
1 one
3 THREE
5 five
2 TWO
Note: It is not possible to update a field in the destination table that is used to merge with the source table.



وهذا المصدر اذا لم يظهر الكود بشكل واضح
http://www.adp-gmbh..../sql/merge.html

#6 Yousef_Elkordi

Yousef_Elkordi

    عضو

  • الأعضــاء
  • 20 مشاركة

تاريخ المشاركة 13 May 2009 - 04:53 PM

السلام عليكم
اخي العزيز ..
جربت الكود التالي


merge into table_dest d
using
table_source s on (s.id = d.id)
when matched then update set d.txt = s.txt
when not matched then insert (id, txt) values (s.id, s.txt);
select * from table_dest; ID TXT

ولكن الامر WHEM غير معرف بال SQL ???

ولك جزيل الشكر

#7 tanbet

tanbet

    عضو

  • الأعضــاء
  • 43 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 14 May 2009 - 10:21 AM

قد تكون المشكلة في الجمله من نسخة الداتابيس لأن merge مدعومة فقط منذ oracle9i وما بعدها أما النسخ السابقة فهي غير موجودة


أعتقد ان الحل سيكون بعدة أجزاء أي سنقسم عبارة الmerge
فسيكون عندي عبرة لإدخال ما هو جديد
وعبارة أخرى تعدل الموجود
أنا جربت على الجداول السابقة في المثال فأعطتني نفس نتيجة الmerge

وهذا هو الكود

update table_dest a
set a.txt = nvl((select b.txt
from table_source b
where b.id = a.id
),a.txt)
where exists(select 1
from table_source b2
where b2.id = a.id)
/

insert into table_dest(id,txt) SELECT a.id, a.txt
FROM table_source a
where not exists (SELECT 1
FROM table_dest b
where b.id = a.id)


وهما كما ترى جمليتين واحدة تعدل الموجود أصلا
وأخرى تدخل الغير موجود