Contacte

Ștergerea înregistrărilor din baza de date SQL. Oracle - Remove - Ștergere duplicate SQL Partition Nume

Eliminarea înregistrărilor

Pentru a elimina înregistrările din tabel, se aplică operatorul de ștergere:

Ștergeți de la Nametablitsa unde starea;

Acest operator elimină înregistrarea din tabelul specificat (și nu separați valorile coloanei) care satisfac starea specificată. Condiția este o expresie logică, ale căror designuri au fost luate în considerare în clasele anterioare de laborator.

Următoarea interogare șterge înregistrarea din tabelul de client, în care valoarea coloanei LNAME este "Ivanov":

Ștergeți de la client.

Unde LNAME \u003d "Ivanov"

Dacă tabelul conține informații despre mai mulți clienți cu numele de familie al lui Ivanov, atunci toate vor fi eliminate.

În declarația Unde poate fi o subvenționare pentru o probă de date (Selectați instrucțiunea). Subqueries în operatorul de ștergere funcționează în același mod ca în instrucțiunea SELECT. Următoarea cerere șterge toți clienții din orașul Moscova, în timp ce identificatorul unic al orașului este returnat folosind subquery.

Ștergeți de la client.

În cazul în care idcitatea (selectați Idcitatea din orașul în care NityName \u003d "Moscova")

Transact-SQL extinde un SQL standard, permițându-vă să utilizați în declarația de ștergere alta de la unul. Această extensie în care este setată conexiunea poate fi utilizată în locul unei interogări investit în clauza Unde este specificată liniile detașare. Vă permite să specificați datele de la al doilea de la și să ștergeți liniile corespunzătoare din tabelul din prima ofertă de la. În special, cererea anterioară poate fi rescrisă după cum urmează.

Ștergeți de la client.

De la client k interior Alăturați-vă

Funcționarea eliminării înregistrărilor din tabel este periculoasă în sens, care este asociată cu riscul de pierdere ireversibilă a datelor în cazul erorilor semantice (dar nu sintactice) în formularea expresiei SQL. Pentru a evita problemele, se recomandă să executați mai întâi cererea de selecție corespunzătoare pentru a vizualiza înregistrările care vor fi șterse. De exemplu, înainte de a efectua examinarea anterior, cererea de ștergere nu va împiedica cererea de selecție corespunzătoare.

SELECTAȚI *

De la client k interior Alăturați-vă

CITY C pe K.IDCITY \u003d C.IDCITY ȘI C.CITYNAME \u003d "Moscova"

Pentru a șterge toate înregistrările din tabel, este suficient să utilizați declarația de ștergere fără cuvântul cheie unde. În același timp, tabelul cu toate coloanele definite în ea rămâne și este gata să introducă noi înregistrări. De exemplu, următoarea solicitare șterge înregistrările tuturor bunurilor.

Ștergeți de la produs.

Sarcina pentru lucrări independente: Formulați în SQL Solicitare lingvistică pentru eliminarea tuturor comenzilor care nu au nici un produs (adică toate comenzile goale).



Eliminarea liniilor repetitive de la masă în Oracle (14)

Soluția 1)

Ștergeți de la EMP în cazul în care nu a intrat (selectați Max (Rowid) de la Grupul EMP de către Empno);

Soluția 2)

Ștergeți de la EMP, în cazul în care Rowid Rowid RID, Row_Number de Empno) RN de la EMP) unde rn\u003e 1);

Soluția 3)

Am testat ceva în Oracle și umplem masa cu câteva exemple de date, dar în proces am încărcat accidental duplicatele înregistrărilor, deci acum nu pot crea o cheie primară folosind unele coloane.

Cum să ștergeți toate liniile repetitive și să lăsați doar una dintre ele?

Pentru o performanță mai bună, asta am scris:
(Consultați planul de execuție)

Ștergerea de la dvs._table în cazul în care răsuciți (selectați t1.rowid de la dvs._table T1 stânga Înălțați-vă (selectați Min (Rowid) ca Rowid, Column1, Column2, coloana3 din grupul dvs._table cu coloana1, coloana2, coloana3) CO1 ON (T1.rowid \u003d CO1. Rowid) în cazul în care Co1.rowid este nul);

Verificați sub scripturi -

Creați testul de tabel (ID Int, Salt INT);

Introduceți în valorile testului (1.100); Introduceți în valorile testului (1.100); Inserați în valorile testului (2.200); Inserați în valorile testului (2.200); Introduceți în valorile testului (3.300); Introduceți în valorile testului (3.300); Să se angajeze;

Selectați * de la test;

Veți vedea aici 6 înregistrări.
4.Runați sub interogarea -

Ștergeți de la testul în cazul în care Rowid (Selectați RowID de la (Selectați Rowid Row_Number () peste (partiție prin ordin de identificare prin Sal) DUP de la test) unde DUP\u003e 1)

  1. selectați * de la test;

Veți vedea că duplicatele înregistrărilor au fost eliminate.
Sper că acest lucru vă rezolvă cererea. Mulțumiri :)

Pentru a selecta duplicate, numai formatul de solicitare poate fi:

Selectați grupul de explorare (coloana1), gruparea (coloana2), contor (coloana1), coloana1, coloana2 ... de la grupul nostru_table de coloana1, coloana2, coloana3 ... având conta (coloană1)\u003e 1

Astfel, cererea corectă a unei alte sugestii:

Ștergerea din tablenamei A unde a.rowid\u003e Orice (selectați B.rowid de la tablename b în cazul în care.fieldname \u003d b.fieldname și A.fieldname2 \u003d B.fieldname2 și .... așa mai departe .. pentru a identifica rândurile duplicat .. ..)

Această interogare va salva cea mai veche înregistrare din baza de date pentru criteriile selectate în clauza Hotărâtă.

Oracle Certified Associate (2008)

Nu am văzut răspunsurile care utilizează expresii de tabel general și funcții de fereastră. Aceasta este ceea ce mă ușurează să lucrez.

Ștergeți de la tinere în cazul în care răsuciți (cu duplicați ca (SELECT ROWID RID, ROW_NUMBER () peste (partiție de la primul_name, nume de naștere) ca sumă rn (1) peste (partiție de către primul_date, ordinea de naștere între rânduri de nastere între anterioare anterioare Și urmând nelimitat) ca cnt de la tinere în cazul în care load_date este nul) selectați RID de la duplicate unde rn\u003e 1);

Ce trebuie remarcat:

1) Verifică numai câmpurile duplicate din secțiune.

2) Dacă aveți un motiv să alegeți un duplicat față de ceilalți, puteți utiliza comanda oferind astfel încât această linie să aibă row_number () \u003d 1

3) Puteți schimba duplicarea numărului salvat prin schimbarea ofertei finale de unde la "unde rn\u003e n" cu n\u003e \u003d 1 (am crezut că n \u003d 0 va șterge toate rândurile cu duplicate, dar pur și simplu ștergeți toate liniile ),

4) Suma suplimentară a secțiunii câmpului, Query CTE, care se va căsători cu fiecare numere de linii de culoare din grup. Prin urmare, pentru a selecta rânduri cu duplicate, inclusiv primul element, utilizați "unde cNT\u003e 1".

1. Cerere

Ștergeți de la EMP în cazul în care nu a intrat (selectați Max (Rowid) de la Grupul EMP de către Empno);

2. SLUVE

Ștergeți de la EMP, în cazul în care Rowid Rowid RID, Row_Number de Empno) RN de la EMP) unde rn\u003e 1);

3. SOLUTIONAL

Ștergeți de la EMP E1 unde nu este în (selectați Max (Rowid) de la EMP E2 unde e1.empno \u003d E2.empno);

4. Cerere

Ștergeți de la EMP, în cazul în care Rowid Rowid RID, DENSE_Rank () peste (partiția de către Empno Ordinul de RN RN de la EMP) unde rn\u003e 1);

Creați sau înlocuiți procedura Delete_Duplicat_enq ca cursor C1 este selectat * din anchetă; Începeți pentru Z în buclă C1 Ștergeți anchetă în cazul în care enquiry.enquiryno \u003d z.enquiryno și rowid\u003e Orice (Selectați Rowid de la anchetă unde enquiry.enquiryno \u003d z.enquiryno); Farfurie; End delete_duplicat_enq;

Creați tabel ABCD (numărul de identificare (10), numele Varchar2 (20)) Introduceți în valori ABCD (1, "ABC") Introduceți în valori ABCD (2, "PQR") Introduceți în valori ABCD (3, "xyz") Inserție În valorile ABCD (1, "ABC") Introduceți în valori ABCD (2, "PQR") Introduceți în valori ABCD (3, "xyz") Selectați * din numele ID ABCD 1 ABC 2 PQR 3 XYZ 1 ABC 2 PQR 3 XYZ Ștergerea înregistrării duplicat, dar păstrați înregistrarea distinctă în tabelul Ștergeți de la ABCD A Unde Rowid\u003e (Selectați min (Rowid) de la ABCD B unde B.ID \u003d A.Id); Rulați interogarea de mai sus 3 rânduri Ștergeți selectați * din numele ID ABCD 1 ABC 2 PQR 3 XYZ



Îndepărtarea prin Oracle Rowid (14)

Am testat ceva în Oracle și umplem masa cu câteva exemple de date, dar în proces am încărcat accidental duplicatele înregistrărilor, deci acum nu pot crea o cheie primară folosind unele coloane.

Cum să ștergeți toate liniile repetitive și să lăsați doar una dintre ele?

Soluția 1)

Ștergeți de la EMP în cazul în care nu a intrat (selectați Max (Rowid) de la Grupul EMP de către Empno);

Soluția 2)

Ștergeți de la EMP, în cazul în care Rowid Rowid RID, Row_Number de Empno) RN de la EMP) unde rn\u003e 1);

Soluția 3)

Pentru o performanță mai bună, asta am scris:
(Consultați planul de execuție)

Ștergerea de la dvs._table în cazul în care răsuciți (selectați t1.rowid de la dvs._table T1 stânga Înălțați-vă (selectați Min (Rowid) ca Rowid, Column1, Column2, coloana3 din grupul dvs._table cu coloana1, coloana2, coloana3) CO1 ON (T1.rowid \u003d CO1. Rowid) în cazul în care Co1.rowid este nul);

Verificați sub scripturi -

Creați testul de tabel (ID Int, Salt INT);

Introduceți în valorile testului (1.100); Introduceți în valorile testului (1.100); Inserați în valorile testului (2.200); Inserați în valorile testului (2.200); Introduceți în valorile testului (3.300); Introduceți în valorile testului (3.300); Să se angajeze;

Selectați * de la test;

Veți vedea aici 6 înregistrări.
4.Runați sub interogarea -

Ștergeți de la testul în cazul în care Rowid (Selectați RowID de la (Selectați Rowid Row_Number () peste (partiție prin ordin de identificare prin Sal) DUP de la test) unde DUP\u003e 1)

  1. selectați * de la test;

Veți vedea că duplicatele înregistrărilor au fost eliminate.
Sper că acest lucru vă rezolvă cererea. Mulțumiri :)

Pentru a selecta duplicate, numai formatul de solicitare poate fi:

Selectați grupul de explorare (coloana1), gruparea (coloana2), contor (coloana1), coloana1, coloana2 ... de la grupul nostru_table de coloana1, coloana2, coloana3 ... având conta (coloană1)\u003e 1

Astfel, cererea corectă a unei alte sugestii:

Ștergerea din tablenamei A unde a.rowid\u003e Orice (selectați B.rowid de la tablename b în cazul în care.fieldname \u003d b.fieldname și A.fieldname2 \u003d B.fieldname2 și .... așa mai departe .. pentru a identifica rândurile duplicat .. ..)

Această interogare va salva cea mai veche înregistrare din baza de date pentru criteriile selectate în clauza Hotărâtă.

Oracle Certified Associate (2008)

Nu am văzut răspunsurile care utilizează expresii de tabel general și funcții de fereastră. Aceasta este ceea ce mă ușurează să lucrez.

Ștergeți de la tinere în cazul în care răsuciți (cu duplicați ca (SELECT ROWID RID, ROW_NUMBER () peste (partiție de la primul_name, nume de naștere) ca sumă rn (1) peste (partiție de către primul_date, ordinea de naștere între rânduri de nastere între anterioare anterioare Și urmând nelimitat) ca cnt de la tinere în cazul în care load_date este nul) selectați RID de la duplicate unde rn\u003e 1);

Ce trebuie remarcat:

1) Verifică numai câmpurile duplicate din secțiune.

2) Dacă aveți un motiv să alegeți un duplicat față de ceilalți, puteți utiliza comanda oferind astfel încât această linie să aibă row_number () \u003d 1

3) Puteți schimba duplicarea numărului salvat prin schimbarea ofertei finale de unde la "unde rn\u003e n" cu n\u003e \u003d 1 (am crezut că n \u003d 0 va șterge toate rândurile cu duplicate, dar pur și simplu ștergeți toate liniile ),

4) Suma suplimentară a secțiunii câmpului, Query CTE, care se va căsători cu fiecare numere de linii de culoare din grup. Prin urmare, pentru a selecta rânduri cu duplicate, inclusiv primul element, utilizați "unde cNT\u003e 1".

1. Cerere

Ștergeți de la EMP în cazul în care nu a intrat (selectați Max (Rowid) de la Grupul EMP de către Empno);

2. SLUVE

Ștergeți de la EMP, în cazul în care Rowid Rowid RID, Row_Number de Empno) RN de la EMP) unde rn\u003e 1);

3. SOLUTIONAL

Ștergeți de la EMP E1 unde nu este în (selectați Max (Rowid) de la EMP E2 unde e1.empno \u003d E2.empno);

4. Cerere

Ștergeți de la EMP, în cazul în care Rowid Rowid RID, DENSE_Rank () peste (partiția de către Empno Ordinul de RN RN de la EMP) unde rn\u003e 1);

Creați sau înlocuiți procedura Delete_Duplicat_enq ca cursor C1 este selectat * din anchetă; Începeți pentru Z în buclă C1 Ștergeți anchetă în cazul în care enquiry.enquiryno \u003d z.enquiryno și rowid\u003e Orice (Selectați Rowid de la anchetă unde enquiry.enquiryno \u003d z.enquiryno); Farfurie; End delete_duplicat_enq;

Creați tabel ABCD (numărul de identificare (10), numele Varchar2 (20)) Introduceți în valori ABCD (1, "ABC") Introduceți în valori ABCD (2, "PQR") Introduceți în valori ABCD (3, "xyz") Inserție În valorile ABCD (1, "ABC") Introduceți în valori ABCD (2, "PQR") Introduceți în valori ABCD (3, "xyz") Selectați * din numele ID ABCD 1 ABC 2 PQR 3 XYZ 1 ABC 2 PQR 3 XYZ Ștergerea înregistrării duplicat, dar păstrați înregistrarea distinctă în tabelul Ștergeți de la ABCD A Unde Rowid\u003e (Selectați min (Rowid) de la ABCD B unde B.ID \u003d A.Id); Rulați interogarea de mai sus 3 rânduri Ștergeți selectați * din numele ID ABCD 1 ABC 2 PQR 3 XYZ

Oracle vă permite să ștergeți linii din tabele, vizualizări, reprezentări materializate, subqueries și vizualizări partiționate și tabele după cum urmează.

(Nume de nume) numai (nume_table)) [pseudonim] [(partiție) subpartation

(Nume))] | (SUBQUIER)] | Tabel (expresie_lit_collection) [(+)])

În variabil [, ...]]

Parametrii sunt prezentați mai jos.

name_table [pseudonim]

Specifică tabelul, reprezentarea, vizualizarea materializată sau tabelul sau vizualizarea partiționată, de unde vor fi șterse înregistrările. Dacă doriți, puteți în fața numelui_table specificați schema sau specificați după numele conexiunii la masă la baza de date. În caz contrar, sistemul Oracle va utiliza diagrama curentă și serverul de bază de date locale. Dacă doriți, puteți atribui un nume de pseudonim. Pseudonimul este necesar dacă tabelul se referă la metoda de tip atribut sau obiect.

Numele de partiție secțiunea.

Operația de ștergere se aplică partiției specificate și nu la întregul tabel. Când ștergeți de la o masă partiționată, nu este necesar să specificați numele partiției, dar acest lucru, în multe cazuri, ajută la reducerea complexității ofertei de ofertă.

Subpartation)

Eliminarea se aplică subsecțiunii specificate și nu la întregul tabel.

(SUBQUIER)])

Se indică faptul că scopul operațiunii de îndepărtare este suprasolicitat subquery și nu un tabel, reprezentare sau alt obiect de bază de date. Parametrii acestei propuneri sunt după cum urmează.

subquery.

Declarația SELECT este specificată, care este o substanță. Puteți crea orice submarin standard, dar nu poate conține comanda cu oferte.

Cu citire numai

Se indică faptul că subquery nu poate fi actualizată.

Cu opțiunea de verificare

Sistemul Oracle va deflecta orice modificare a tabelului la distanță care nu sunt vizibile în setul de date de subvenționare rezultat.

Constrângere name_name.

Sistemul Oracle va limita modificările făcute pe baza restricției cu numele NAME_NAME.

Tabel (expresie pentru rulare) [(+)]

Sistemul Oracle se va ocupa de expresii ale diverselor ca masă, deși poate fi o subquery, o funcție sau un alt constructor al colecției. În orice caz, valoarea returnată de expresia pentru rulare ar trebui să fie o masă imbricată sau varradă.

Revenirea expresiei

Rânduri afectate de comanda în care comanda de ștergere returnează în mod obișnuit numai numărul de șiruri de la distanță. Propunerea de întoarcere poate fi utilizată dacă scopul comenzii este o masă, o viziune sau o reprezentare materializată de o masă de bază. Dacă oferta este utilizată la ștergerea unei singure linii, atunci valorile de la șirul de la distanță, care sunt definite de expresie sunt stocate în variabile PL / SQL și leagă variabilele (legați variabilele). Dacă propunerea este utilizată la scoaterea mai multor linii, atunci valorile din șirurile de la distanță care sunt determinate de agricultură și M sunt stocate în matricele de legare (Bind Arrays).

În variabilă

Specificați variabilele în care valorile returnate ca urmare a propunerii returnării.

La executarea instrucțiunii Ștergere Oracle, returnează locul înapoi la tabelul sau indicele în care datele au fost stocate în tabel (sau tabelul de bază).

Dacă datele sunt șterse din prezentare, vizualizarea nu poate conține operațiuni peste seturi, cuvinte cheie distincte, conexiuni, o funcție agregată, funcție analitică, subqueries Select, oferte de grup, oferă comanda de către, ofertele Conectați-vă sau Începeți.

Mai jos este un exemplu în care ștergem date de la un server de la distanță.

Ștergeți de la Scott. [E-mail protejat];

În exemplul următor

Ștergem datele din tabelul specificat în expresia colecției.

Ștergeți tabelul (selectați contact de la clienți

cu unde c.costomererid \u003d "bottm") în cazul în care s. Regiunea este nulă sau s.country \u003d "Mexic";

Dar un exemplu de ștergere din secțiune.

Ștergerea din partiția de vânzări (vânzător_q3_1997) unde QTy\u003e 10000;

În cele din urmă, în exemplul următor, folosim propunerea de întoarcere pentru a vedea valorile la distanță.

Ștergeți de la angajat în cazul în care job_id \u003d 13

Și hire_date + to_yminterval ("01-06") \u003d.

În exemplul anterior, intrările din tabelul angajatului sunt șterse, iar valorile lui J Obi VL sunt returnate la o variabilă predeterminată: intol.



Ți-a plăcut articolul? Împărtășește-l