delete by rowid oracle (14)

Testujem niečo v Oracle a napĺňam tabuľku niekoľkými vzorovými údajmi, ale v tomto procese som omylom načítal duplicitné záznamy, takže teraz nemôžem vytvoriť primárny kľúč pomocou niektorých stĺpcov.

Ako odstrániť všetky duplicitné riadky a nechať len jeden z nich?

riešenie 1)

vymazať z emp, kde rowid nie je (vyberte max(rowid) zo skupiny emp podľa empno);

riešenie 2)

delete from emp where rowid in (select rid from (select rowid rid, row_number() over(partition by empno order by empno) rn from emp) where rn > 1);

riešenie 3)

Pre lepší výkon, tu je to, čo som napísal:
(pozri plán realizácie)

DELETE FROM your_table WHERE rowid IN (vyberte t1.rowid z your_table t1 LEFT OUTER JOIN (SELECT MIN(rowid) ako rowid, column1,column2, column3 FROM your_table GROUP BY column1, column2, column3) co1 ON (t1.rowid = co1. rowid) WHERE co1.rowid JE NULL);

Skontrolujte nižšie uvedené skripty -

Vytvorte test tabuľky (id int, sal int);

vložiť do testových hodnôt (1 100); vložiť do testových hodnôt (1 100); vložiť do testových hodnôt (2 200); vložiť do testových hodnôt (2 200); vložiť do testových hodnôt (3 300); vložiť do testových hodnôt (3 300); zaviazať sa;

vyberte * z testu;

Tu uvidíte 6 záznamov.
4.spustiť pod dotazom -

Delete from test where rowid in (select rowid from (select rowid, row_number() over (partition by id order by sal) dup from test) where dup > 1)

  1. vyberte * z testu;

Uvidíte, že duplicitné položky boli odstránené.
Dúfam, že to vyrieši vašu požiadavku. Vďaka:)

Ak chcete vybrať duplikáty, iba formát dotazu môže byť:

SELECT GroupFunction(stĺpec1), GroupFunction(stĺpec2),..., COUNT(stĺpec1), stĺpec1, stĺpec2... Z našej_tabuľky GROUP BY stĺpec1, stĺpec2, stĺpec3... HAVING COUNT(stĺpec1) > 1

Takže správny dotaz na druhý návrh je:

DELETE FROM tablename a WHERE a.ROWID > ANY (VYBERTE b.ROWID FROM tablename b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 AND ....tak ďalej... na identifikáciu duplicitných riadkov.. ..)

Tento dotaz ušetrí najviac starý záznam v databáze pre kritériá vybrané v klauzule WHERE .

Oracle Certified Associate (2008)

Nevidel som odpovede, ktoré používajú bežné tabuľkové výrazy a funkcie okien. S tou sa mi pracuje najľahšie.

DELETE FROM YourTable WHERE ROWID IN (S duplikátmi AKO (SELECT ROWID RID, ROW_NUMBER() OVER(PARTITION BY First_Meno, Last_Name, Birth_Date) AS RN SUM(1) OVER(PARTITION BY First_Meno, Last_Meno, Birth_Date) WID RENDBY BOUND_DATE PREDCHÁDZAJÚCE A BEZ OBMEDZENIA NASLEDUJÚCE) AKO CNT Z vašej tabuľky WHERE Load_Date IS NULL) SELECT RID FROM duplicates WHERE RN > 1);

Dôležité poznámky:

1) Kontrolujeme iba duplicitné polia v sekcii.

2) Ak máte dôvod vybrať si jeden duplikát pred ostatnými, môžete použiť klauzulu order by tak, aby tento riadok mal row_number() = 1

3) Uložené duplicitné číslo môžete zmeniť zmenou koncovej klauzuly where na „Kde RN>N“ s N>=1 (myslel som si, že N=0 odstráni všetky riadky s duplikátmi, ale odstráni všetky riadky).

4) Pridané pole sekcie Sum, dopyt CTE, ktorý označí každý fow číslami riadkov v skupine. Takže na výber riadkov s duplikátmi vrátane prvého prvku použite "WHERE cnt > 1".

1. riešenie

Delete from emp kde rowid in (vyberte max(rowid) zo skupiny emp by empno);

2. riešenie

Delete from emp where rowid in (select rid from (select rowid rid, row_number() over(partition by empno order by empno) rn from emp) where rn > 1);

3.riešenie

Delete from emp e1 where rowid not in (vyberte max(rowid) z emp e2 where e1.empno = e2.empno);

4. riešenie

Delete from emp where rowid in (select rid from (select rowid rid, dense_rank() over(partition by empno order by rowid) rn from emp) where rn > 1);

Vytvorte alebo nahraďte procedúru delete_duplicate_enq, pretože kurzor c1 je vybratý * z dopytu; začať pre z v slučke c1 vymazať dopyt kde enquiry.enquiryno = z.enquiryno a rowid > any (vyberte rowid z dopytu, kde enquiry.enquiryno = z.enquiryno); koncová slučka; end delete_duplicate_enq;

Vytvorenie tabuľky abcd(id number(10),name varchar2(20)) vložiť do abcd values(1,"abc") vložiť do abcd values(2,"pqr") vložiť do abcd values(3,,xyz") vložiť do hodnôt abcd(1,"abc") vložiť do hodnôt abcd(2,"pqr") vložiť do hodnôt abcd(3,"xyz") vybrať * z id abcd Názov 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Vymazať duplicitný záznam, ale ponechať odlišný záznam v tabuľke DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); spustiť vyššie uvedený dotaz 3 riadky odstrániť vybrať * z abcd id Meno 1 abc 2 pqr 3 xyz

Odstraňovanie záznamov

Príkaz DELETE sa používa na odstránenie záznamov z tabuľky:

DELETE FROM názov tabuľky WHERE podmienka;

Tento príkaz odstráni zo zadanej tabuľky záznamy (nie hodnoty jednotlivých stĺpcov), ktoré spĺňajú zadanú podmienku. Podmienka je boolovský výraz, rôzne prevedenia ktoré boli zahrnuté v predchádzajúcich laboratóriách.

Nasledujúci dotaz odstráni záznamy z tabuľky Zákazník, v ktorej je hodnota stĺpca LName "Ivanov":

VYMAZAŤ OD zákazníka

WHERE LName = "Ivanov"

Ak tabuľka obsahuje informácie o niekoľkých klientoch s priezviskom Ivanov, potom budú všetci vymazaní.

Klauzula WHERE môže obsahovať poddotaz na výber údajov (príkaz SELECT). Poddotazy v príkaze DELETE fungujú presne rovnakým spôsobom ako v príkaze SELECT. Nasledujúci dotaz odstráni všetkých zákazníkov z mesta Moskva, pričom pomocou poddotazu sa vráti jedinečný identifikátor mesta.

VYMAZAŤ OD zákazníka

WHERE IdCity IN (SELECT IdCity FROM City WHERE CityName = "Moskva")

Transact-SQL rozširuje štandardný SQL tým, že vám umožňuje použiť ďalšiu klauzulu FROM v príkaze DELETE. Toto rozšírenie spojenia možno použiť namiesto poddotazu v klauzule WHERE na určenie riadkov, ktoré sa majú vymazať. Umožňuje vám nastaviť údaje z druhého FROM a odstrániť zodpovedajúce riadky z tabuľky v prvej klauzule FROM. Najmä predchádzajúci dotaz by sa dal prepísať nasledovne

VYMAZAŤ OD zákazníka

OD zákazníka k INNER JOIN

Operácia odstraňovania záznamov z tabuľky je nebezpečná v tom zmysle, že je spojená s rizikom nevratnej straty dát v prípade sémantických (nie však syntaktických) chýb vo formulácii SQL príkazu. Aby ste predišli problémom, odporúčame vám pred odstránením záznamov najskôr spustiť príslušný výberový dotaz, aby ste zistili, ktoré záznamy budú odstránené. Takže napríklad pred vykonaním odstraňovacieho dotazu, o ktorom sme hovorili vyššie, by nebolo na škodu vykonať zodpovedajúci výberový dotaz.

VYBRAŤ *

OD zákazníka k INNER JOIN

Mesto c ON k.IdCity = c.IdCity AND c.CityName = "Moskva"

Ak chcete odstrániť všetky záznamy z tabuľky, použite príkaz DELETE bez kľúčové slovo KDE. Zároveň je samotná tabuľka so všetkými v nej zadefinovanými stĺpcami uložená a pripravená na vkladanie nových záznamov. Napríklad nasledujúci dotaz odstráni záznamy pre všetky produkty.

VYMAZAŤ Z produktu

Úloha na samostatnú prácu: Formulujte ďalej jazyk SQLžiadosť o vymazanie všetkých objednávok, ktoré neobsahujú žiadny tovar (t.j. všetky prázdne objednávky).



Odstránenie duplicitných riadkov z tabuľky v Oracle (14)

riešenie 1)

vymazať z emp, kde rowid nie je (vyberte max(rowid) zo skupiny emp podľa empno);

riešenie 2)

delete from emp where rowid in (select rid from (select rowid rid, row_number() over(partition by empno order by empno) rn from emp) where rn > 1);

riešenie 3)

Testujem niečo v Oracle a napĺňam tabuľku niekoľkými vzorovými údajmi, ale v tomto procese som omylom načítal duplicitné záznamy, takže teraz nemôžem vytvoriť primárny kľúč pomocou niektorých stĺpcov.

Ako odstrániť všetky duplicitné riadky a nechať len jeden z nich?

Pre lepší výkon, tu je to, čo som napísal:
(pozri plán realizácie)

DELETE FROM your_table WHERE rowid IN (vyberte t1.rowid z your_table t1 LEFT OUTER JOIN (SELECT MIN(rowid) ako rowid, column1,column2, column3 FROM your_table GROUP BY column1, column2, column3) co1 ON (t1.rowid = co1. rowid) WHERE co1.rowid JE NULL);

Skontrolujte nižšie uvedené skripty -

Vytvorte test tabuľky (id int, sal int);

vložiť do testových hodnôt (1 100); vložiť do testových hodnôt (1 100); vložiť do testových hodnôt (2 200); vložiť do testových hodnôt (2 200); vložiť do testových hodnôt (3 300); vložiť do testových hodnôt (3 300); zaviazať sa;

vyberte * z testu;

Tu uvidíte 6 záznamov.
4.spustiť pod dotazom -

Delete from test where rowid in (select rowid from (select rowid, row_number() over (partition by id order by sal) dup from test) where dup > 1)

  1. vyberte * z testu;

Uvidíte, že duplicitné položky boli odstránené.
Dúfam, že to vyrieši vašu požiadavku. Vďaka:)

Ak chcete vybrať duplikáty, iba formát dotazu môže byť:

SELECT GroupFunction(stĺpec1), GroupFunction(stĺpec2),..., COUNT(stĺpec1), stĺpec1, stĺpec2... Z našej_tabuľky GROUP BY stĺpec1, stĺpec2, stĺpec3... HAVING COUNT(stĺpec1) > 1

Takže správny dotaz na druhý návrh je:

DELETE FROM tablename a WHERE a.ROWID > ANY (VYBERTE b.ROWID FROM tablename b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 AND ....tak ďalej... na identifikáciu duplicitných riadkov.. ..)

Tento dotaz uloží najstarší záznam v databáze pre kritériá zvolené v klauzule WHERE.

Oracle Certified Associate (2008)

Nevidel som odpovede, ktoré používajú bežné tabuľkové výrazy a funkcie okien. S tou sa mi pracuje najľahšie.

DELETE FROM YourTable WHERE ROWID IN (S duplikátmi AKO (SELECT ROWID RID, ROW_NUMBER() OVER(PARTITION BY First_Meno, Last_Name, Birth_Date) AS RN SUM(1) OVER(PARTITION BY First_Meno, Last_Meno, Birth_Date) WID RENDBY BOUND_DATE PREDCHÁDZAJÚCE A BEZ OBMEDZENIA NASLEDUJÚCE) AKO CNT Z vašej tabuľky WHERE Load_Date IS NULL) SELECT RID FROM duplicates WHERE RN > 1);

Dôležité poznámky:

1) Kontrolujeme iba duplicitné polia v sekcii.

2) Ak máte dôvod vybrať si jeden duplikát pred ostatnými, môžete použiť klauzulu order by tak, aby tento riadok mal row_number() = 1

3) Uložené duplicitné číslo môžete zmeniť zmenou koncovej klauzuly where na „Kde RN>N“ s N>=1 (myslel som si, že N=0 odstráni všetky riadky s duplikátmi, ale odstráni všetky riadky).

4) Pridané pole sekcie Sum, dopyt CTE, ktorý označí každý fow číslami riadkov v skupine. Takže na výber riadkov s duplikátmi vrátane prvého prvku použite "WHERE cnt > 1".

1. riešenie

Delete from emp kde rowid in (vyberte max(rowid) zo skupiny emp by empno);

2. riešenie

Delete from emp where rowid in (select rid from (select rowid rid, row_number() over(partition by empno order by empno) rn from emp) where rn > 1);

3.riešenie

Delete from emp e1 where rowid not in (vyberte max(rowid) z emp e2 where e1.empno = e2.empno);

4. riešenie

Delete from emp where rowid in (select rid from (select rowid rid, dense_rank() over(partition by empno order by rowid) rn from emp) where rn > 1);

Vytvorte alebo nahraďte procedúru delete_duplicate_enq, pretože kurzor c1 je vybratý * z dopytu; začať pre z v slučke c1 vymazať dopyt kde enquiry.enquiryno = z.enquiryno a rowid > any (vyberte rowid z dopytu, kde enquiry.enquiryno = z.enquiryno); koncová slučka; end delete_duplicate_enq;

Vytvorenie tabuľky abcd(id number(10),name varchar2(20)) vložiť do abcd values(1,"abc") vložiť do abcd values(2,"pqr") vložiť do abcd values(3,,xyz") vložiť do hodnôt abcd(1,"abc") vložiť do hodnôt abcd(2,"pqr") vložiť do hodnôt abcd(3,"xyz") vybrať * z id abcd Názov 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Vymazať duplicitný záznam, ale ponechať odlišný záznam v tabuľke DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); spustiť vyššie uvedený dotaz 3 riadky odstrániť vybrať * z abcd id Meno 1 abc 2 pqr 3 xyz

Platforma Oracle vám umožňuje vymazať riadky z tabuliek, pohľadov, materializovaných pohľadov, vnorených poddotazov a rozdelených pohľadov a tabuliek nasledovne.

(názov_tabuľky | LEN (názov_tabuľky)) [alias] [(PARTITION (názov_oddielu) SUBPARTITION

(názov podsekcie))] | (poddotaz )]) | TABUĽKA (výraz_zbierky) [(+)])

INTO premenná [, …]]

Parametre sú uvedené nižšie.

table_name [alias]

Určuje tabuľku, zobrazenie, materializované zobrazenie alebo rozdelenú tabuľku alebo zobrazenie, z ktorého sa majú vymazať záznamy. Voliteľne môžete pred table_name uviesť schému alebo zadať pripojenie k databáze za názvom tabuľky. V opačnom prípade Oracle použije aktuálnu schému a lokálny server Databáza. Voliteľne môžete atribútu table_name priradiť alias. Alias ​​sa vyžaduje, ak tabuľka odkazuje na atribút alebo metódu typu objektu.

Názov oddielu PARTITION

Operácia odstránenia sa použije na zadaný oddiel, nie na celú tabuľku. Pri odstraňovaní z rozdelenej tabuľky nie je potrebné zadať názov oddielu, ale v mnohých prípadoch to pomáha znížiť zložitosť klauzuly WHERE.

SUBPARTITION (subpartition_name)

Odstránenie sa použije na zadaný podkľúč, nie na celú tabuľku.

(poddotaz )])

Určuje, že cieľom operácie vymazania je vnorený poddotaz a nie tabuľka, zobrazenie alebo iný databázový objekt. Parametre tohto návrhu sú nasledovné.

poddotaz

Je špecifikovaný príkaz SELECT, čo je poddotaz. Môžete vytvoriť ľubovoľný štandardný poddotaz, ale nemôže obsahovať klauzuly ORDER BY.

LEN NA ČÍTANIE

Označuje, že poddotaz nemožno aktualizovať.

S MOŽNOSŤOU KONTROLY

Oracle odmietne akékoľvek zmeny vo vzdialenej tabuľke, ktoré nie sú viditeľné v sade výsledkov poddotazu.

CONSTRAINT názov_obmedzenia

Systém Oracle obmedzí vykonané zmeny na základe obmedzenia s názvom názov_obmedzenia.

TABLE (výraz pre rolovanie) [(+)]

Systém Oracle bude s rolovacím výrazom zaobchádzať ako s tabuľkou, hoci v skutočnosti môže ísť o poddotaz, funkciu alebo iný konštruktor kolekcie. V oboch prípadoch musí byť hodnota vrátená výrazom For Rollection vnorená tabuľka alebo VARRAY.

NÁVRATNÝ výraz

Načíta riadky ovplyvnené príkazom, kde príkaz DELETE normálne vráti iba počet odstránené riadky. Klauzula RETURNING sa môže použiť, ak je cieľom príkazu tabuľka, materializované zobrazenie alebo zobrazenie jednej základnej tabuľky. Ak sa klauzula použije pri odstraňovaní jedného riadka, hodnoty z odstráneného riadku, ktoré sú určené výrazom, sa uložia do premenných PL/SQL a premenných väzieb. Ak sa klauzula použije pri odstraňovaní viacerých riadkov, hodnoty z odstránených riadkov, ktoré sú určené výrazom, sa uložia do polí väzieb.

DO premennej

Uvádzajú sa premenné, do ktorých sa zapisujú hodnoty vrátené v dôsledku klauzuly RETURNING.

Pri vykonávaní príkazu DELETE Oracle vráti uvoľnený priestor v tabuľke (alebo základnej tabuľke zobrazenia) späť do tabuľky alebo indexu, kde boli údaje uložené.

Ak sú zo zobrazenia odstránené údaje, zobrazenie nemôže obsahovať množinové operácie, kľúčové slovo DISTINCT, spojenia, súhrnnú funkciu, analytickú funkciu, poddotazy SELECT, klauzulu GROUP BY, klauzulu ORDER BY, klauzulu CONNECT BY alebo START S doložkou.

Nižšie je uvedený príklad, keď vymažeme údaje zo vzdialeného servera.

VYMAZAŤ ZO Scott [e-mail chránený];

V nasledujúcom príklade

odstraňujeme údaje z odvodenej tabuľky špecifikovanej vo výraze pre kolekciu.

DELETE TABLE (VYBERTE kontaktné meno OD zákazníkov

s WHERE c.customerid="BOTTM") s WHERE s. región JE NULL ALEBO s.country="MEXICO";

A tu je príklad vymazania zo sekcie.

VYMAZAŤ Z predajného PARTITION (sales_q3_1997) WHERE množ. > 10000;

Nakoniec v nasledujúcom príklade použijeme klauzulu RETURNING na zobrazenie odstránených hodnôt.

DELETE FROM zamestnanec WHERE job_id=13

AND dátum_nájmu + TO_YMINTERVAL("01-06") =.

Predchádzajúci príklad odstráni záznamy z tabuľky zamestnancov a vráti hodnoty j obi vl do preddefinovanej premennej: int.