smazat by rowid oracle (14)

Testuji něco v Oracle a naplňuji tabulku nějakými ukázkovými daty, ale v tomto procesu jsem omylem načetl duplicitní záznamy, takže teď nemohu vytvořit primární klíč pomocí některých sloupců.

Jak odstranit všechny duplicitní řádky a ponechat pouze jeden z nich?

Řešení 1)

odstranit z emp, kde rowid není (vyberte max(rowid) ze skupiny emp podle empno);

Řešení 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);

Řešení 3)

Pro lepší výkon, zde je to, co jsem napsal:
(viz plán realizace)

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

Zkontrolujte níže uvedené skripty -

Vytvořit test tabulky (id int,sal int);

vložit do testových hodnot(1 100); vložit do testových hodnot(1 100); vložit do testových hodnot(2 200); vložit do testových hodnot(2 200); vložit do testových hodnot(3 300); vložit do testových hodnot(3 300); spáchat;

vyberte * z testu;

Zde uvidíte 6 záznamů.
4.spustit pod dotazem -

Odstranit z testu kde rowid in (vybrat rowid z (vybrat rowid, row_number() přes (rozdělit podle id pořadí podle sal) dup z testu) where dup > 1)

  1. vyberte * z testu;

Uvidíte, že duplicitní položky byly odstraněny.
Doufám, že to vyřeší váš požadavek. Díky:)

Chcete-li vybrat duplikáty, může být pouze formát dotazu:

SELECT GroupFunction(sloupec1), GroupFunction(sloupec2),..., COUNT(sloupec1), sloupec1, sloupec2... Z naší_tabulky GROUP BY sloupec1, sloupec2, sloupec3... HAVING COUNT(sloupec1) > 1

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

DELETE FROM tablename a WHERE a.ROWID > ANY (SELECT b.ROWID FROM tablename b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 AND ....tak dále... pro identifikaci duplicitních řádků.. ..)

Tento dotaz ušetří nejvíce starý záznam v databázi pro kritéria vybraná v CLAUSE WHERE .

Oracle Certified Associate (2008)

Neviděl jsem odpovědi, které používají běžné tabulkové výrazy a funkce okna. S tou se mi nejsnáze pracuje.

DELETE FROM YourTable WHERE ROWID IN (S duplikáty JAKO (SELECT ROWID RID, ROW_NUMBER() OVER (ODDĚLENÍ PODLE JMÉNA, PŘÍJMENÍ, DATUM_ NAROZENÍ) JAKO RN SUM(1) NAD (ODDÍL PODLE JMÉNA, PŘÍJMENÍ, DATUM_NAROZENÍ) POŘADÍ WID RODER BOUNDED PŘEDCHÁZEJÍCÍ A BEZ OMEZENÍ NÁSLEDUJÍCÍ) AS CNT Z vaší tabulky WHERE Load_Date IS NULL) SELECT RID FROM duplikáty WHERE RN > 1);

Věci k poznámce:

1) Kontrolujeme pouze duplicitní pole v sekci.

2) Pokud máte důvod vybrat jeden duplikát před ostatními, můžete použít klauzuli order by tak, aby tento řádek měl row_number() = 1

3) Uložené duplicitní číslo můžete změnit změnou koncové klauzule where na „Kde RN>N“ s N>=1 (myslel jsem, že N=0 odstraní všechny řádky s duplikáty, ale pouze odstraní všechny řádky).

4) Přidáno pole sekce Součet, dotaz CTE, který označí každý fow čísly řádků ve skupině. Chcete-li tedy vybrat řádky s duplikáty, včetně prvního prvku, použijte "WHERE cnt > 1".

1. řešení

Smazat z emp, kde rowid není (vyberte max(rowid) ze skupiny emp podle empno);

2. řešení

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.řešení

Smazat z emp e1 kde rowid není v (vyberte max(rowid) z emp e2 kde e1.empno = e2.empno);

4. řešení

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);

Vytvořte nebo nahraďte proceduru delete_duplicate_enq, protože kurzor c1 je vybrat * z dotazu; begin for z v cyklu c1 delete inquiry where enquiry.enquiryno = z.enquiryno a rowid > any (vyberte rowid z dotazu kde enquiry.enquiryno = z.enquiryno); koncová smyčka; end delete_duplicate_enq;

Vytvořit tabulku abcd(id number(10),name varchar2(20)) vložit do abcd values(1,"abc") vložit do abcd values(2,"pqr") vložit do abcd values(3,"xyz") vložit do abcd values(1,"abc") vložit do abcd values(2,"pqr") vložit do abcd values(3,"xyz") vybrat * z abcd id Název 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Smazat duplicitní záznam, ale zachovat odlišný záznam v tabulce DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); spustit výše uvedený dotaz 3 řádky odstranit vybrat * z abcd id Jméno 1 abc 2 pqr 3 xyz

Mazání záznamů

Příkaz DELETE se používá k odstranění záznamů z tabulky:

DELETE FROM název tabulky WHERE podmínka;

Tento příkaz odstraní ze zadané tabulky záznamy (nikoli hodnoty jednotlivých sloupců), které splňují zadanou podmínku. Podmínka je booleovský výraz, různá provedení které byly probrány v předchozích cvičeních.

Následující dotaz odebere záznamy z tabulky Zákazník, ve kterých je hodnota sloupce LName "Ivanov":

ODSTRANIT OD zákazníka

WHERE LName = "Ivanov"

Pokud tabulka obsahuje informace o několika klientech s příjmením Ivanov, budou všichni smazáni.

Klauzule WHERE může obsahovat poddotaz pro výběr dat (příkaz SELECT). Dílčí dotazy v příkazu DELETE fungují přesně stejným způsobem jako v příkazu SELECT. Následující dotaz odebere všechny zákazníky z města Moskva s jedinečným identifikátorem města vráceným pomocí dílčího dotazu.

ODSTRANIT OD zákazníka

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

Transact-SQL rozšiřuje standardní SQL tím, že umožňuje použít další klauzuli FROM v příkazu DELETE. Toto rozšíření, které určuje spojení, lze použít místo poddotazu v klauzuli WHERE k určení řádků, které mají být odstraněny. Umožňuje nastavit data z druhého FROM a odstranit odpovídající řádky z tabulky v první klauzuli FROM. Zejména předchozí dotaz by mohl být přepsán následovně

ODSTRANIT OD zákazníka

OD zákazníka k INNER JOIN

Operace mazání záznamů z tabulky je nebezpečná v tom smyslu, že je spojena s rizikem nevratné ztráty dat v případě sémantických (nikoli však syntaktických) chyb ve formulaci SQL příkazu. Abyste předešli problémům, před odstraněním záznamů se doporučuje nejprve spustit příslušný výběrový dotaz a zjistit, které záznamy budou odstraněny. Takže například před provedením odstraňovacího dotazu diskutovaného výše by nebylo na škodu provést odpovídající výběrový dotaz.

VYBRAT *

OD zákazníka k INNER JOIN

Město c ON k.IdCity = c.IdCity AND c.CityName = "Moskva"

Chcete-li odstranit všechny záznamy z tabulky, použijte příkaz DELETE bez klíčové slovo KDE. Zároveň je samotná tabulka se všemi sloupci v ní definovaných uložena a připravena pro vkládání nových záznamů. Například následující dotaz odebere záznamy pro všechny produkty.

ODSTRANIT Z produktu

Úkol pro samostatnou práci: Formulujte dál jazyk SQL požadavek na smazání všech objednávek, které neobsahují žádné zboží (tedy všechny prázdné objednávky).



Odstranění duplicitních řádků z tabulky v Oracle (14)

Řešení 1)

odstranit z emp, kde rowid není (vyberte max(rowid) ze skupiny emp podle empno);

Řešení 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);

Řešení 3)

Testuji něco v Oracle a naplňuji tabulku nějakými ukázkovými daty, ale v tomto procesu jsem omylem načetl duplicitní záznamy, takže teď nemohu vytvořit primární klíč pomocí některých sloupců.

Jak odstranit všechny duplicitní řádky a ponechat pouze jeden z nich?

Pro lepší výkon, zde je to, co jsem napsal:
(viz plán realizace)

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

Zkontrolujte níže uvedené skripty -

Vytvořit test tabulky (id int,sal int);

vložit do testových hodnot(1 100); vložit do testových hodnot(1 100); vložit do testových hodnot(2 200); vložit do testových hodnot(2 200); vložit do testových hodnot(3 300); vložit do testových hodnot(3 300); spáchat;

vyberte * z testu;

Zde uvidíte 6 záznamů.
4.spustit pod dotazem -

Odstranit z testu kde rowid in (vybrat rowid z (vybrat rowid, row_number() přes (rozdělit podle id pořadí podle sal) dup z testu) where dup > 1)

  1. vyberte * z testu;

Uvidíte, že duplicitní položky byly odstraněny.
Doufám, že to vyřeší váš požadavek. Díky:)

Chcete-li vybrat duplikáty, může být pouze formát dotazu:

SELECT GroupFunction(sloupec1), GroupFunction(sloupec2),..., COUNT(sloupec1), sloupec1, sloupec2... Z naší_tabulky GROUP BY sloupec1, sloupec2, sloupec3... HAVING COUNT(sloupec1) > 1

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

DELETE FROM tablename a WHERE a.ROWID > ANY (SELECT b.ROWID FROM tablename b WHERE a.fieldname = b.fieldname AND a.fieldname2 = b.fieldname2 AND ....tak dále... pro identifikaci duplicitních řádků.. ..)

Tento dotaz uloží nejstarší záznam v databázi pro kritéria vybraná v klauzuli WHERE.

Oracle Certified Associate (2008)

Neviděl jsem odpovědi, které používají běžné tabulkové výrazy a funkce okna. S tou se mi nejsnáze pracuje.

DELETE FROM YourTable WHERE ROWID IN (S duplikáty JAKO (SELECT ROWID RID, ROW_NUMBER() OVER (ODDĚLENÍ PODLE JMÉNA, PŘÍJMENÍ, DATUM_ NAROZENÍ) JAKO RN SUM(1) NAD (ODDÍL PODLE JMÉNA, PŘÍJMENÍ, DATUM_NAROZENÍ) POŘADÍ WID RODER BOUNDED PŘEDCHÁZEJÍCÍ A BEZ OMEZENÍ NÁSLEDUJÍCÍ) AS CNT Z vaší tabulky WHERE Load_Date IS NULL) SELECT RID FROM duplikáty WHERE RN > 1);

Věci k poznámce:

1) Kontrolujeme pouze duplicitní pole v sekci.

2) Pokud máte důvod vybrat jeden duplikát před ostatními, můžete použít klauzuli order by tak, aby tento řádek měl row_number() = 1

3) Uložené duplicitní číslo můžete změnit změnou koncové klauzule where na „Kde RN>N“ s N>=1 (myslel jsem, že N=0 odstraní všechny řádky s duplikáty, ale pouze odstraní všechny řádky).

4) Přidáno pole sekce Součet, dotaz CTE, který označí každý fow čísly řádků ve skupině. Chcete-li tedy vybrat řádky s duplikáty, včetně prvního prvku, použijte "WHERE cnt > 1".

1. řešení

Smazat z emp, kde rowid není (vyberte max(rowid) ze skupiny emp podle empno);

2. řešení

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.řešení

Smazat z emp e1 kde rowid není v (vyberte max(rowid) z emp e2 kde e1.empno = e2.empno);

4. řešení

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);

Vytvořte nebo nahraďte proceduru delete_duplicate_enq, protože kurzor c1 je vybrat * z dotazu; begin for z v cyklu c1 delete inquiry where enquiry.enquiryno = z.enquiryno a rowid > any (vyberte rowid z dotazu kde enquiry.enquiryno = z.enquiryno); koncová smyčka; end delete_duplicate_enq;

Vytvořit tabulku abcd(id number(10),name varchar2(20)) vložit do abcd values(1,"abc") vložit do abcd values(2,"pqr") vložit do abcd values(3,"xyz") vložit do abcd values(1,"abc") vložit do abcd values(2,"pqr") vložit do abcd values(3,"xyz") vybrat * z abcd id Název 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Smazat duplicitní záznam, ale zachovat odlišný záznam v tabulce DELETE FROM abcd a WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b WHERE b.id=a.id); spustit výše uvedený dotaz 3 řádky odstranit vybrat * z abcd id Jméno 1 abc 2 pqr 3 xyz

Platforma Oracle umožňuje odstraňovat řádky z tabulek, pohledů, materializovaných pohledů, vnořených poddotazů a rozdělených pohledů a tabulek následovně.

(název_tabulky | POUZE (název_tabulky)) [alias] [(ODDĚLENÍ (název_oddílu) PODODDĚLENÍ

(název_podsekce))] | (poddotaz )]) | TABLE (výraz_kolekce) [(+)])

DO proměnné [, …]]

Parametry jsou uvedeny níže.

název_tabulky [alias]

Určuje tabulku, pohled, materializovaný pohled nebo rozdělenou tabulku nebo pohled, ze kterého se mají odstranit záznamy. Volitelně můžete před název_tabulky uvést schéma nebo za názvem tabulky zadat připojení k databázi. Jinak Oracle použije aktuální schéma a lokální server Databáze. Volitelně můžete název_tabulky přiřadit alias. Alias ​​je povinný, pokud tabulka odkazuje na atribut nebo metodu typu objektu.

Název oddílu PARTITION

Operace odstranění se použije na zadaný oddíl, nikoli na celou tabulku. Při mazání z dělené tabulky není nutné uvádět název oddílu, ale v mnoha případech to pomáhá snížit složitost klauzule WHERE.

SUBPARTITION (subpartition_name)

Odstranění se použije na zadaný podklíč, nikoli na celou tabulku.

(poddotaz )])

Určuje, že cílem operace odstranění je vnořený poddotaz a nikoli tabulka, pohled nebo jiný databázový objekt. Parametry tohoto návrhu jsou následující.

poddotaz

Je zadán příkaz SELECT, což je poddotaz. Můžete vytvořit libovolný standardní poddotaz, ale nesmí obsahovat klauzule ORDER BY.

POUZE PRO ČTENÍ

Označuje, že poddotaz nelze aktualizovat.

S MOŽNOSTÍ KONTROLY

Oracle odmítne jakékoli změny vzdálené tabulky, které nejsou viditelné ve výsledné sadě dílčího dotazu.

CONSTRAINT název_omezení

Systém Oracle omezí změny, které provedete, na základě omezení s názvem název_podmínky.

TABLE (výraz pro rolování) [(+)]

Systém Oracle bude zacházet s rollexpression jako s tabulkou, i když to může být ve skutečnosti poddotaz, funkce nebo jiný konstruktor kolekce. V obou případech musí být hodnota vrácená výrazem For Rollection vnořená tabulka nebo VARRAY.

VRÁCENÝ výraz

Načte řádky ovlivněné příkazem, kde příkaz DELETE normálně vrátí pouze počet smazané řádky. Klauzuli RETURNING lze použít, pokud je cílem příkazu tabulka, materializovaný pohled nebo pohled na jednu základní tabulku. Pokud se klauzule použije při mazání jednoho řádku, pak se hodnoty z odstraněného řádku, které jsou určeny výrazem, uloží do proměnných PL/SQL a proměnných vazby. Pokud se klauzule použije při mazání více řádků, pak se hodnoty z odstraněných řádků, které jsou určeny výrazem, uloží do vazebných polí.

DO proměnné

Jsou určeny proměnné, do kterých se zapisují hodnoty vrácené jako výsledek klauzule RETURNING.

Při provádění příkazu DELETE vrátí Oracle uvolněný prostor v tabulce (nebo podkladové tabulce zobrazení) zpět do tabulky nebo indexu, kde byla data uložena.

Pokud jsou z pohledu odstraněna data, pohled nemůže obsahovat operace sady, klíčové slovo DISTINCT, spojení, agregační funkci, analytickou funkci, poddotazy SELECT, klauzuli GROUP BY, klauzuli ORDER BY, klauzuli CONNECT BY nebo START. S doložkou.

Níže je uveden příklad, kdy odstraníme data ze vzdáleného serveru.

ODSTRANIT OD scott [e-mail chráněný];

V následujícím příkladu

odstraňujeme data z odvozené tabulky zadané ve výrazu pro kolekci.

DELETE TABLE (VYBERTE jméno kontaktu OD zákazníků

s WHERE c.customerid="BOTTM") s WHERE s. region JE NULL NEBO s.country="MEXICO";

A zde je příklad smazání ze sekce.

ODSTRANIT Z ODDĚLENÍ PRODEJ (sales_q3_1997) KDE množství > 10000;

Nakonec v následujícím příkladu použijeme klauzuli RETURNING k zobrazení odstraněných hodnot.

DELETE FROM zaměstnanec WHERE job_id=13

AND datum_náboru + TO_YMINTERVAL("01-06") =.

Předchozí příklad odstraní záznamy z tabulky zaměstnanců a vrátí hodnoty j obi vl do předdefinované proměnné: inl.