अपडेट नहीं करें क्या ऑरैकल डालने और हटाने के लिए विलय का उपयोग करने का कोई तरीका है लेकिन अद्यतन नहीं है?ओरेकल एसक्यूएल डालने और हटाने के लिए मर्ज करें लेकिन
मेरे पास एक तालिका है जो किसी अन्य तालिका में एक पंक्ति से संबंधित मानों का एक सेट दर्शाती है। मैं उन सभी को हटाकर और नए सेट को वापस जोड़कर, या चुनिंदा रूप से कुछ हटाने और दूसरों को जोड़कर मूल्यों का सेट बदल सकता हूं, लेकिन यदि संभव हो तो मुझे इसे एक कथन बनाने में दिलचस्पी है।
यहां अपडेट के साथ एक कामकाजी उदाहरण है। इस काम को करने के लिए, मुझे dummy
जोड़ना पड़ा ताकि अपडेट करने के लिए एक कॉलम उपलब्ध हो जो on
स्थिति में नहीं था। अद्यतन करने के लिए एक डमी कॉलम के बिना केवल हटाने और डालने का कोई तरीका है?
on
स्थिति से कोई कॉलम update set
स्थिति में हो सकता है भले ही यह वास्तव में अपडेट नहीं किया गया हो।
create table every_value (the_value varchar2(32));
create table paired_value (the_id number, a_value varchar2(32) , dummy number default 0);
-- the_id is a foreign_key to a row in another table
insert into every_value (the_value) values ('aaa');
insert into every_value (the_value) values ('abc');
insert into every_value (the_value) values ('ace');
insert into every_value (the_value) values ('adg');
insert into every_value (the_value) values ('aei');
insert into every_value (the_value) values ('afk');
-- pair ace and afk with id 3
merge into paired_value p using every_value e
on (p.the_id = 3 and p.a_value = e.the_value)
when matched then update set dummy=dummy+1
delete where a_value not in ('ace','afk')
when not matched then insert (the_id,a_value)
values (3,e.the_value)
where e.the_value in ('ace','afk');
-- pair ace and aei with id 3
-- should remove afk, add aei, do nothing with ace
merge into paired_value p using every_value e
on (p.the_id = 3 and p.a_value = e.the_value)
when matched then update set dummy = dummy+1
delete where a_value not in ('ace','aei')
when not matched then insert (the_id,a_value)
values (3,e.the_value)
where e.the_value in ('ace','aei');
-- pair aaa and adg with id 4
merge into paired_value p using every_value e
on (p.the_id = 4 and p.a_value = e.the_value)
when matched then update set dummy = dummy+1
delete where a_value not in ('aaa','adg')
when not matched then insert (the_id,a_value)
values (4,e.the_value)
where e.the_value in ('aaa','adg');
select * from paired_value;
मैं Oracle 10g में यह करने की कोशिश की और इस sqlfiddle, ओरेकल 11g के साथ, है।
मुझे यकीन था कि डमी कॉलम होने से कोई बेहतर तरीका नहीं था, लेकिन मैं इसके लिए सिर्फ एक डमी कॉलम नहीं जोड़ूंगा। ओह अच्छा। – drawnonward