Aș dori să scriu astăzi despre o actualizare "complexă" a datelor din Oracle folosind mai multe tabele. Toți dezvoltatorii de baze de date știu cum să actualizeze datele, acesta este unul dintre primele lucruri pe care toată lumea le studiază. Nu voi vărsa apă în acest articol, cei care sunt puțin familiarizați cu actualizarea în principiu, cred că este necesar să citim ce este și ce este mâncat, iar pentru cei care se consideră deja experimentați, vă întreb! Deci, cea mai simplă actualizare arată astfel:
actualizare table1 set column1 = 'Novosibirsk' unde column1 = 'Sahalin'
Dar ce să facă atunci când aveți nevoie pentru a actualiza datele într-un tabel în baza de date într-un alt tabel? Hm..davayte do it 🙂 Recent, la locul de muncă, am văzut un coleg a lansat semne de actualizare, în căutarea printr-un script special (apoi a scrie un articol separat pe script-ul), ceea ce face, ce codul său, și cel mai important - cât de mult va fi executat script-ul ( da, Oracle poate arăta timpul de sfârșitul tabelului de servicii speciale), pur și simplu ofigel - executarea script trebuie să se termine, reclame 🙂 5 zile din cauza tuturor actualizare algoritm secțiunea non-optimizate prin cezariană. Deci, să începem.
actualizare (selectați t.adress_shop, t.adress_client, s.adress_shop ca adress_shop_new, s.adress_client ca adress_client_new din tabel1 t interior se alăture Table2 s pe s.ur_number = t.ur_number) set tt tt.adress_shop = tt.adress_shop_new, tt. adress_client = tt.adress_client_new
Cred că toți înțelegeți ce și cum. Voi explica un pic - selectați câmpurile pe care doriți să le actualizați din primul tabel, și apoi selectați din al doilea tabel care trebuie să fie actualizate. Toate aceste fel de bine pe care le prinde prin numărul de contract (nu uitați de duplicate). De asemenea, aici în mod specific de a utiliza același nume de domeniu, care într-un fel a făcut 2 complică câmp pentru a actualiza după «set», și doar o dată vine întrebarea cum să actualizați atât cele 2 câmpuri.
Aici am folosit «interior Participați», dar se poate alătura oricine - care după cum doriți, în funcție de obiectivele postalennoy și performanța. În consecință, în join'e puteți folosi mai multe mese. Cred că toată lumea știe cum să se alăture altor mese, pe care nu le voi descrie, în nici o carte pe care o puteți găsi. Am vrut doar să vă arăt ce nu există în fiecare carte pe care o veți găsi. Când am început să lucrez cu Oracle a crescut am întrebări referitoare la această actualizare, am o dată ajutat când eram novice, acum vreau să te ajut 🙂 Apropo, există o altă modalitate de a face aceeași actualizare, ci prin «îmbinare» - această declarație pentru a «insera» , "Ștergeți" și "actualizați". Am scrie un script cu unele explicații, în cazul în care nu este clar - poți cere mereu întrebarea:
MERGE ÎN tabel1 T UTILIZAREA (SELECT * FROM Table2 s) p ON (p.ur_number = t.ur_number), atunci când, apoi compensata - atunci când a coincis contractul, este el însuși să actualizeze actualizare set t.adress_shop = p.adress_shop, t.adress_client = p.adress_client CÂND necorelate apoi introduceți (t.adress_shop) valori ( „Nimic găsit“)
Apropo, a doua opțiune este considerată a avea un nivel mai ridicat. Acesta arată că sunteți familiarizat cu o actualizare complexă și știți cum să lucrați cu operatorul "îmbinare".
În plus, a doua modalitate este că puteți introduce o valoare implicită dacă condiția de cuplare nu funcționează. Apropo, toate funcționează în Oracle 10g, și în versiunea 9.
Sper că totul este clar și cineva va veni la îndemână.
Am această întrebare. Există un tabel INFO (info TABLE SREATE (num, nume, prenume, sndoc, sdoc, numdoc))
Esența următoarelor. În câmpul sndoc, toate datele sunt de forma SSnnnnnnn, unde S este orice număr și N este orice cifră, iar câmpurile sdoc, numdoc sunt goale.
Este necesar să executați UPDATE care de la sndoc la sdoc, numdoc va introduce simbolurile și numerele în consecință. SUBSTR (sndoc, 1, 2) - acest select'om primește caracterele a SUBSTR (sndoc, 3, 9) primesc numerele. Cum se execută UPDATE cu aceste SELECTuri?
Spuneți-mi, vă rog, cum pot impune o restricție asupra câmpurilor din tabelul t, când nu aveți nevoie de actualizare pe toate câmpurile, dar, de exemplu, unde începe t.adress_client pe A?
Trebuie doar să specificați condiția "unde", adică va exista ceva de genul asta "unde t.adress_client este" A% "". Dacă nu este ceva clar, scrieți, vom înțelege 🙂