Контакти

Видалення записів з бази даних SQL. Oracle - прибрати - видалення дублікатів sql PARTITION ім'я розділу

видалення записів

Для видалення записів з таблиці застосовується оператор DELETE:

DELETE FROM ІмяТабліци WHERE умова;

Даний оператор видаляє з зазначеної таблиці записи (а не окремі значення стовпців), які задовольняють зазначеному умові. Умова - це логічний вираз, різні конструкції якого були розглянуті в попередніх лабораторних заняттях.

Наступний запит видаляє записи з таблиці Customer, в якій значення стовпця LName одно "Іванов":

DELETE FROM Customer

WHERE LName \u003d "Іванов"

Якщо таблиця містяться відомості про декілька клієнтів з прізвищем Іванов, то всі вони будуть видалені.

В операторі WHERE може перебувати підзапит на вибірку даних (оператор SELECT). Підзапити в операторі DELETE працюють точно так же, як і в операторі SELECT. Наступний запит видаляє всіх клієнтів з міста Москва, при цьому унікальний ідентифікатор міста повертається за допомогою підзапиту.

DELETE FROM Customer

WHERE IdCity IN (SELECT IdCity FROM City WHERE CityName \u003d "Москва")

Transact-SQL розширює стандартний SQL, дозволяючи використовувати в інструкції DELETE ще одну пропозицію FROM. Це розширення, в якому задається з'єднання, може бути використано замість вкладеного запиту в реченні WHERE для вказівки видаляються рядків. Воно дозволяє задавати дані з другого FROM і видаляти відповідні рядки з таблиці в першому реченні FROM. Зокрема попередній запит може бути переписаний наступним чином

DELETE FROM Customer

FROM Customer k INNER JOIN

Операція видалення записів з таблиці є небезпечною в тому сенсі, що пов'язана з ризиком необоротних втрат даних у разі семантичних (але не синтаксичних) помилок при формулюванні SQL-вирази. Щоб уникнути неприємностей, перед видаленням записів рекомендується спочатку виконати відповідний запит на вибірку, щоб переглянути, які записи будуть видалені. Так, наприклад, перед виконанням розглянутого раніше запиту на видалення не перешкодить виконати відповідний запит на вибірку.

SELECT *

FROM Customer k INNER JOIN

City c ON k.IdCity \u003d c.IdCity AND c.CityName \u003d "Москва"

Для видалення всіх записів з таблиці досить використовувати оператор DELETE без ключового слова WHERE. При цьому сама таблиця з усіма визначеними в ній стовпцями зберігається і готова для вставки нових записів. Наприклад, наступний запит видаляє записи про всі товари.

DELETE FROM Product

Завдання для самостійної роботи: Сформулюйте на мові SQL запит на видалення всіх замовлень, які не мають в складі жодного товару (т. Е. Все порожні замовлення).



Видалення повторюваних рядків з таблиці в Oracle (14)

Рішення 1)

delete from emp where rowid not in (select max (rowid) from emp group by empno);

Рішення 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\u003e 1);

Рішення 3)

Я тестую щось в Oracle і заповнюю таблицю деякими прикладами даних, але в процесі я випадково завантажував дублікати записів, тому тепер я не можу створити первинний ключ, використовуючи деякі з стовпців.

Як видалити всі повторювані рядки і залишити тільки один з них?

Для кращої продуктивності, ось що я написав:
(Див. План виконання)

DELETE FROM your_table WHERE rowid IN (select t1.rowid from your_table t1 LEFT OUTER JOIN (SELECT MIN (rowid) as rowid, column1, column2, column3 FROM your_table GROUP BY column1, column2, column3) co1 ON (t1.rowid \u003d co1. rowid) WHERE co1.rowid IS NULL);

Перевірте нижче скрипти -

Create table test (id int, sal int);

Insert into test values \u200b\u200b(1,100); insert into test values \u200b\u200b(1,100); insert into test values \u200b\u200b(2,200); insert into test values \u200b\u200b(2,200); insert into test values \u200b\u200b(3,300); insert into test values \u200b\u200b(3,300); commit;

Select * from test;

Ви побачите тут 6 записів.
4.run нижче запиту -

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\u003e 1)

  1. select * from test;

Ви побачите, що дублікати заголовків були вилучені.
Сподіваюся, це вирішує ваш запит. завдяки :)

Щоб вибрати дублікати, тільки формат запиту може бути:

SELECT GroupFunction (column1), GroupFunction (column2), ..., COUNT (column1), column1, column2 ... FROM our_table GROUP BY column1, column2, column3 ... HAVING COUNT (column1)\u003e 1

Таким чином, правильний запит по іншому пропозицією:

DELETE FROM tablename a WHERE a.ROWID\u003e ANY (SELECT b.ROWID FROM tablename b WHERE a.fieldname \u003d b.fieldname AND a.fieldname2 \u003d b.fieldname2 AND .... so on .. to identify the duplicate rows .. ..)

Цей запит збереже найстарішу запис в базі даних для критеріїв, обраних в WHERE CLAUSE.

Oracle Certified Associate (2008)

Я не бачив відповідей, які використовують загальні вирази таблиць і функції вікна. Це те, з чим мені найлегше працювати.

DELETE FROM YourTable WHERE ROWID IN (WITH Duplicates AS (SELECT ROWID RID, ROW_NUMBER () OVER (PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM (1) OVER (PARTITION BY First_Name, Last_Name, Birth_Date ORDER BY ROWID ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS CNT FROM YourTable WHERE Load_Date IS NULL) SELECT RID FROM duplicates WHERE RN\u003e 1);

Що слід відзначити:

1) Ми перевіряємо тільки дублювання полів в розділі.

2) Якщо у вас є причина вибрати один дублікат над іншими, ви можете використовувати пропозицію order by, щоб цей рядок мала row_number () \u003d 1

3) Ви можете змінити дублікат числа, збережений, змінивши остаточну пропозицію where на «Where RN\u003e N» з N\u003e \u003d 1 (я думав, що N \u003d 0 видалить всі рядки з дублікатами, але просто видалить всі рядки),

4) Додано поле розділу Sum, запит CTE, який буде позначати кожен fow номерами рядків в групі. Тому для вибору рядків з дублікатами, включаючи перший елемент, використовуйте «WHERE cnt\u003e 1».

1. рішення

Delete from emp where rowid not in (select max (rowid) from emp group by empno);

2. slution

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\u003e 1);

3.solution

Delete from emp e1 where rowid not in (select max (rowid) from emp e2 where e1.empno \u003d e2.empno);

4. рішення

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\u003e 1);

Create or replace procedure delete_duplicate_enq as cursor c1 is select * from enquiry; begin for z in c1 loop delete enquiry where enquiry.enquiryno \u003d z.enquiryno and rowid\u003e any (select rowid from enquiry where enquiry.enquiryno \u003d z.enquiryno); end loop; end delete_duplicate_enq;

Create table abcd (id number (10), name varchar2 (20)) insert into abcd values \u200b\u200b(1, "abc") insert into abcd values \u200b\u200b(2, "pqr") insert into abcd values \u200b\u200b(3, "xyz") insert into abcd values \u200b\u200b(1, "abc") insert into abcd values \u200b\u200b(2, "pqr") insert into abcd values \u200b\u200b(3, "xyz") select * from abcd id Name 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Delete Duplicate record but keep Distinct Record in table DELETE FROM abcd a WHERE ROWID\u003e (SELECT MIN (ROWID) FROM abcd b WHERE b.id \u003d a.id); run the above query 3 rows delete select * from abcd id Name 1 abc 2 pqr 3 xyz



видалення по rowid oracle (14)

Я тестую щось в Oracle і заповнюю таблицю деякими прикладами даних, але в процесі я випадково завантажував дублікати записів, тому тепер я не можу створити первинний ключ, використовуючи деякі з стовпців.

Як видалити всі повторювані рядки і залишити тільки один з них?

Рішення 1)

delete from emp where rowid not in (select max (rowid) from emp group by empno);

Рішення 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\u003e 1);

Рішення 3)

Для кращої продуктивності, ось що я написав:
(Див. План виконання)

DELETE FROM your_table WHERE rowid IN (select t1.rowid from your_table t1 LEFT OUTER JOIN (SELECT MIN (rowid) as rowid, column1, column2, column3 FROM your_table GROUP BY column1, column2, column3) co1 ON (t1.rowid \u003d co1. rowid) WHERE co1.rowid IS NULL);

Перевірте нижче скрипти -

Create table test (id int, sal int);

Insert into test values \u200b\u200b(1,100); insert into test values \u200b\u200b(1,100); insert into test values \u200b\u200b(2,200); insert into test values \u200b\u200b(2,200); insert into test values \u200b\u200b(3,300); insert into test values \u200b\u200b(3,300); commit;

Select * from test;

Ви побачите тут 6 записів.
4.run нижче запиту -

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\u003e 1)

  1. select * from test;

Ви побачите, що дублікати заголовків були вилучені.
Сподіваюся, це вирішує ваш запит. завдяки :)

Щоб вибрати дублікати, тільки формат запиту може бути:

SELECT GroupFunction (column1), GroupFunction (column2), ..., COUNT (column1), column1, column2 ... FROM our_table GROUP BY column1, column2, column3 ... HAVING COUNT (column1)\u003e 1

Таким чином, правильний запит по іншому пропозицією:

DELETE FROM tablename a WHERE a.ROWID\u003e ANY (SELECT b.ROWID FROM tablename b WHERE a.fieldname \u003d b.fieldname AND a.fieldname2 \u003d b.fieldname2 AND .... so on .. to identify the duplicate rows .. ..)

Цей запит збереже найстарішу запис в базі даних для критеріїв, обраних в WHERE CLAUSE.

Oracle Certified Associate (2008)

Я не бачив відповідей, які використовують загальні вирази таблиць і функції вікна. Це те, з чим мені найлегше працювати.

DELETE FROM YourTable WHERE ROWID IN (WITH Duplicates AS (SELECT ROWID RID, ROW_NUMBER () OVER (PARTITION BY First_Name, Last_Name, Birth_Date) AS RN SUM (1) OVER (PARTITION BY First_Name, Last_Name, Birth_Date ORDER BY ROWID ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS CNT FROM YourTable WHERE Load_Date IS NULL) SELECT RID FROM duplicates WHERE RN\u003e 1);

Що слід відзначити:

1) Ми перевіряємо тільки дублювання полів в розділі.

2) Якщо у вас є причина вибрати один дублікат над іншими, ви можете використовувати пропозицію order by, щоб цей рядок мала row_number () \u003d 1

3) Ви можете змінити дублікат числа, збережений, змінивши остаточну пропозицію where на «Where RN\u003e N» з N\u003e \u003d 1 (я думав, що N \u003d 0 видалить всі рядки з дублікатами, але просто видалить всі рядки),

4) Додано поле розділу Sum, запит CTE, який буде позначати кожен fow номерами рядків в групі. Тому для вибору рядків з дублікатами, включаючи перший елемент, використовуйте «WHERE cnt\u003e 1».

1. рішення

Delete from emp where rowid not in (select max (rowid) from emp group by empno);

2. slution

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\u003e 1);

3.solution

Delete from emp e1 where rowid not in (select max (rowid) from emp e2 where e1.empno \u003d e2.empno);

4. рішення

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\u003e 1);

Create or replace procedure delete_duplicate_enq as cursor c1 is select * from enquiry; begin for z in c1 loop delete enquiry where enquiry.enquiryno \u003d z.enquiryno and rowid\u003e any (select rowid from enquiry where enquiry.enquiryno \u003d z.enquiryno); end loop; end delete_duplicate_enq;

Create table abcd (id number (10), name varchar2 (20)) insert into abcd values \u200b\u200b(1, "abc") insert into abcd values \u200b\u200b(2, "pqr") insert into abcd values \u200b\u200b(3, "xyz") insert into abcd values \u200b\u200b(1, "abc") insert into abcd values \u200b\u200b(2, "pqr") insert into abcd values \u200b\u200b(3, "xyz") select * from abcd id Name 1 abc 2 pqr 3 xyz 1 abc 2 pqr 3 xyz Delete Duplicate record but keep Distinct Record in table DELETE FROM abcd a WHERE ROWID\u003e (SELECT MIN (ROWID) FROM abcd b WHERE b.id \u003d a.id); run the above query 3 rows delete select * from abcd id Name 1 abc 2 pqr 3 xyz

Платформа Oracle дозволяє видаляти рядки з таблиць, уявлень, матеріалізованих уявлень, вкладених підзапитів і секціонованих уявлень і таблиць в такий спосіб.

(Ім'я_таблиці | ONLY (ім'я_таблиці)) [псевдонім] [(PARTITION (ім'я_розділу) SUBPARTITION

(Імя_подраздела))] | (Підзапит)]) | TABLE (вираженіе_для_коллекціі) [(+)])

INTO змінна [...]]

Параметри наведені нижче.

ім'я_таблиці [псевдонім]

Вказується таблиця, подання, матеріалізоване уявлення або секціонірованная таблиця або подання, звідки будуть видалятися записи. При бажанні ви можете перед іменем_табліци вказати схему або вказати після імені таблиці з'єднання з базою даних. В іншому випадку система Oracle буде використовувати поточну схему і локальний сервер бази даних. При бажанні ви можете привласнити імені_табліци який-небудь псевдонім. Ім'я користувача є необхідним, якщо таблиця посилається на атрибут або метод об'єктного типу.

PARTITION ім'я розділу

Операція видалення застосовується до вказаного розділу, а не до всієї таблиці. При видаленні з секціонірованной таблиці необов'язково вказувати ім'я розділу, але це в багатьох випадках допомагає зменшити складність пропозиції WHERE.

SUBPARTITION (імя_подраздела)

Видалення застосовується до зазначеного підрозділу, а не до всієї таблиці.

(Підзапит)])

Вказується, що метою операції видалення є вкладений підзапит, а не таблиця, подання або інший об'єкт бази даних. Параметри цієї пропозиції наступні.

підзапит

Вказується інструкція SELECT, яка представляє собою підзапит. Можна створювати будь-який стандартний підзапит, але він не може містити пропозиції ORDER BY.

WITH READ ONLY

Вказується, що підзапит не може бути оновлений.

WITH CHECK OPTION

Система Oracle буде відхиляти будь-які зміни віддаленої таблиці, які не видно в результуючому наборі даних підзапиту.

CONSTRAINT імя_ограніченія

Система Oracle обмежить вносяться зміни, грунтуючись на обмеження з ім'ям імя_ограніченія.

TABLE (вираз Для роллекціі) [(+)]

Система Oracle буде обробляти виражеііе_дляроллекціі як таблицю, хоча фактично це може бути підзапит, функція або інший конструктор колекції. У будь-якому випадку значення, що повертається виразом Для роллекціі, має представляти собою вкладену таблицю або VARRAY.

RETURNING вираз

Витягуються рядки, порушені командою там, де команда DELETE зазвичай повертає тільки кількість вилучених рядків. Пропозиція RETURNING можна застосовувати, якщо метою команди є таблиця, матеріалізоване подання або подання за однієї базової таблиці. Якщо пропозиція використовується при видаленні одиночного рядка, то значення з віддаленої рядка, які визначаються виразом, зберігаються в змінних PL / SQL і змінних зв'язування (bind variables). Якщо пропозиція використовується при видаленні багатьох рядків, то значення з віддалених рядків, які визначаються виралсені & м, зберігаються в масивах зв'язування (bind arrays).

INTO змінна

Вказуються змінні, в які записуються значення, які повертаються в результаті роботи пропозиції RETURNING.

При виконанні інструкції DELETE Oracle повертає звільнилося в таблиці (або базової таблиці уявлення) місце назад в таблицю або індекс, де зберігалися дані.

Якщо дані видаляються з уявлення, уявлення не може містити операцій над множинами, ключового слова DISTINCT, з'єднань, агрегатної функції, аналітичної функції, підзапитів SELECT, пропозиції GROUP BY, пропозиції ORDER BY, пропозиції CONNECT BY або START WITH.

Нижче наводиться приклад, в якому ми видаляємо дані з віддаленого сервера.

DELETE FROM scott [Email protected];

У наступному прикладі

ми видаляємо дані з похідною таблиці, зазначеної в вираженні для колекції.

DELETE TABLE (SELECT contactname FROM customers

з WHERE c.customerid \u003d "BOTTM") s WHERE s. region IS NULL OR s.country \u003d "MEXICO";

А ось приклад видалення з розділу.

DELETE FROM sales PARTITION (sales_q3_1997) WHERE qty\u003e 10000;

І нарешті, в наступному прикладі ми використовуємо пропозицію RETURNING, щоб побачити віддалені значення.

DELETE FROM employee WHERE job_id \u003d 13

AND hire_date + TO_YMINTERVAL ( "01-06") \u003d.

У попередньому прикладі видаляються записи з таблиці employee, а значення j obi vl повертаються в заздалегідь визначену змінну: intol.



Сподобалася стаття? поділіться їй