logo

Kā izdzēst dublētās rindas SQL?

Šajā sadaļā mēs uzzinām dažādus veidus, kā izdzēst dublētās rindas MySQL un Oracle . Ja SQL tabulā ir dublētās rindas, tad mums ir jānoņem dublētās rindas.

Datu parauga sagatavošana

Skripts izveido tabulu ar nosaukumu kontaktpersonas .

 DROP TABLE IF EXISTS contacts; CREATE TABLE contacts ( id INT PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(30) NOT NULL, last_name VARCHAR(25) NOT NULL, email VARCHAR(210) NOT NULL, age VARCHAR(22) NOT NULL ); 

Iepriekš minētajā tabulā esam ievietojuši šādus datus.

 INSERT INTO contacts (first_name,last_name,email,age) VALUES ('Kavin','Peterson','[email protected]','21'), ('Nick','Jonas','[email protected]','18'), ('Peter','Heaven','[email protected]','23'), ('Michal','Jackson','[email protected]','22'), ('Sean','Bean','[email protected]','23'), ('Tom ','Baker','[email protected]','20'), ('Ben','Barnes','[email protected]','17'), ('Mischa ','Barton','[email protected]','18'), ('Sean','Bean','[email protected]','16'), ('Eliza','Bennett','[email protected]','25'), ('Michal','Krane','[email protected]','25'), ('Peter','Heaven','[email protected]','20'), ('Brian','Blessed','[email protected]','20'); ('Kavin','Peterson','[email protected]','30'), 

Mēs izpildām skriptu, lai pēc a izpildes atkārtoti izveidotu testa datus DZĒST paziņojums, apgalvojums .

Vaicājums atgriež datus no kontaktpersonu tabulas:

 SELECT * FROM contacts ORDER BY email; 

id vārds uzvārds E-pasts vecums
7 Bens Bārnss [aizsargāts ar e-pastu] divdesmitviens
13 Braiens Svētīts [aizsargāts ar e-pastu] 18
10 Elīza Benets [aizsargāts ar e-pastu] 23
1 Kavins Pētersons [aizsargāts ar e-pastu] 22
14 Kavins Pētersons [aizsargāts ar e-pastu] 23
8 Miša Bārtons [aizsargāts ar e-pastu] divdesmit
vienpadsmit Maikls Krāni [aizsargāts ar e-pastu] 17
4 Maikls Džeksons [aizsargāts ar e-pastu] 18
2 Niks Jonass [aizsargāts ar e-pastu] 16
3 Pēteris Debesis [aizsargāts ar e-pastu] 25
12 Pēteris Debesis [aizsargāts ar e-pastu] 25
5 Šons Pupa [aizsargāts ar e-pastu] divdesmit
9 Šons Pupa [aizsargāts ar e-pastu] divdesmit
6 Toms cepējs [aizsargāts ar e-pastu] 30

Šis SQL vaicājums atgriež e-pasta ziņojumu dublikātus no kontaktpersonu tabulas:

 SELECT email, COUNT(email) FROM contacts GROUP BY email HAVING COUNT (email) > 1; 

e-pasts COUNT(e-pasts)
[aizsargāts ar e-pastu] 2
[aizsargāts ar e-pastu] 2
[aizsargāts ar e-pastu] 2

Mums ir trīs rindas ar dublikāts e-pastiem.

autocad stiepšanas komanda

(A) Dzēsiet rindu dublikātus, izmantojot DELETE JOIN paziņojumu

 DELETE t1 FROM contacts t1 INNERJOIN contacts t2 WHERE t1.id <t2.id and t1.email="t2.email;" < pre> <p> <strong>Output:</strong> </p> <pre> Query OK, three rows affected (0.10 sec) </pre> <p>Three rows had been deleted. We execute the query, given below to finds the <strong>duplicate emails</strong> from the table.</p> <pre> SELECT email, COUNT (email) FROM contacts GROUP BY email HAVING COUNT (email) &gt; 1; </pre> <p>The query returns the empty set. To verify the data from the contacts table, execute the following SQL query:</p> <pre> SELECT * FROM contacts; </pre> <br> <table class="table"> <tr> <td>id</td> <td>first_name</td> <td>last_name</td> <td>Email</td> <td>age</td> </tr> <tr> <td>7</td> <td>Ben</td> <td>Barnes</td> <td> [email protected] </td> <td>21</td> </tr> <tr> <td>13</td> <td>Brian</td> <td>Blessed</td> <td> [email protected] </td> <td>18</td> </tr> <tr> <td>10</td> <td>Eliza</td> <td>Bennett</td> <td> [email protected] </td> <td>23</td> </tr> <tr> <td>1</td> <td>Kavin</td> <td>Peterson</td> <td> [email protected] </td> <td>22</td> </tr> <tr> <td>8</td> <td>Mischa</td> <td>Barton</td> <td> [email protected] </td> <td>20</td> </tr> <tr> <td>11</td> <td>Micha</td> <td>Krane</td> <td> [email protected] </td> <td>17</td> </tr> <tr> <td>4</td> <td>Michal</td> <td>Jackson</td> <td> [email protected] </td> <td>18</td> </tr> <tr> <td>2</td> <td>Nick</td> <td>Jonas</td> <td> [email protected] </td> <td>16</td> </tr> <tr> <td>3</td> <td>Peter</td> <td>Heaven</td> <td> [email protected] </td> <td>25</td> </tr> <tr> <td>5</td> <td>Sean</td> <td>Bean</td> <td> [email protected] </td> <td>20</td> </tr> <tr> <td>6</td> <td>Tom</td> <td>Baker</td> <td> [email protected] </td> <td>30</td> </tr> </table> <p>The rows <strong>id&apos;s 9, 12, and 14</strong> have been deleted. We use the below statement to delete the duplicate rows:</p> <p>Execute the script for <strong>creating</strong> the contact.</p> <pre> DELETE c1 FROM contacts c1 INNERJ OIN contacts c2 WHERE c1.id &gt; c2.id AND c1.email = c2.email; </pre> <br> <table class="table"> <tr> <td>id</td> <td>first_name</td> <td>last_name</td> <td>email</td> <td>age</td> </tr> <tr> <td>1</td> <td>Ben</td> <td>Barnes</td> <td> [email protected] </td> <td>21</td> </tr> <tr> <td>2</td> <td> <strong>Kavin</strong> </td> <td> <strong>Peterson</strong></td> <td> <strong> [email protected] </strong> </td> <td> <strong>22</strong> </td> </tr> <tr> <td>3</td> <td>Brian</td> <td>Blessed</td> <td> [email protected] </td> <td>18</td> </tr> <tr> <td>4</td> <td>Nick</td> <td>Jonas</td> <td> [email protected] </td> <td>16</td> </tr> <tr> <td>5</td> <td>Michal</td> <td>Krane</td> <td> [email protected] </td> <td>17</td> </tr> <tr> <td>6</td> <td>Eliza</td> <td>Bennett</td> <td> [email protected] </td> <td>23</td> </tr> <tr> <td>7</td> <td>Michal</td> <td>Jackson</td> <td> [email protected] </td> <td>18</td> </tr> <tr> <td>8</td> <td> <strong>Sean</strong> </td> <td> <strong>Bean</strong> </td> <td> <strong> [email protected] </strong> </td> <td> <strong>20</strong> </td> </tr> <tr> <td>9</td> <td>Mischa</td> <td>Barton</td> <td> [email protected] </td> <td>20</td> </tr> <tr> <td>10</td> <td> <strong>Peter</strong> </td> <td> <strong>Heaven</strong> </td> <td> <strong> [email protected] </strong> </td> <td> <strong>25</strong> </td> </tr> <tr> <td>11</td> <td>Tom</td> <td>Baker</td> <td> [email protected] </td> <td>30</td> </tr> </table> <h2>(B) Delete duplicate rows using an intermediate table</h2> <p>To delete a duplicate row by using the intermediate table, follow the steps given below:</p> <p> <strong>Step 1</strong> . Create a new table <strong>structure</strong> , same as the real table:</p> <pre> CREATE TABLE source_copy LIKE source; </pre> <p> <strong>Step 2</strong> . Insert the distinct rows from the original schedule of the database:</p> <pre> INSERT INTO source_copy SELECT * FROM source GROUP BY col; </pre> <p> <strong>Step 3</strong> . Drop the original table and rename the immediate table to the original one.</p> <pre> DROP TABLE source; ALTER TABLE source_copy RENAME TO source; </pre> <p>For example, the following statements delete the <strong>rows</strong> with <strong>duplicate</strong> emails from the contacts table:</p> <pre> -- step 1 CREATE TABLE contacts_temp LIKE contacts; -- step 2 INSERT INTO contacts_temp SELECT * FROM contacts GROUP BY email; -- step 3 DROP TABLE contacts; ALTER TABLE contacts_temp RENAME TO contacts; </pre> <h2>(C) Delete duplicate rows using the ROW_NUMBER() Function</h2> <h4>Note: The ROW_NUMBER() function has been supported since MySQL version 8.02, so we should check our MySQL version before using the function.</h4> <p>The following statement uses the <strong>ROW_NUMBER ()</strong> to assign a sequential integer to every row. If the email is duplicate, the row will higher than one.</p> <pre> SELECT id, email, ROW_NUMBER() OVER (PARTITION BY email ORDER BY email ) AS row_num FROM contacts; </pre> <p>The following SQL query returns <strong>id list</strong> of the duplicate rows:</p> <pre> SELECT id FROM (SELECT id, ROW_NUMBER() OVER ( PARTITION BY email ORDER BY email) AS row_num FROM contacts ) t WHERE row_num&gt; 1; </pre> <p> <strong>Output:</strong> </p> <table class="table"> <tr> <td>id</td> </tr> <tr> <td>9</td> </tr> <tr> <td>12</td> </tr> <tr> <td>14</td> </tr> </table> <h2>Delete Duplicate Records in Oracle</h2> <p>When we found the duplicate records in the table, we had to delete the unwanted copies to keep our data clean and unique. If a table has duplicate rows, we can delete it by using the <strong>DELETE</strong> statement.</p> <p>In the case, we have a column, which is not the part of <strong>group</strong> used to <strong>evaluate</strong> the <strong>duplicate</strong> records in the table.</p> <p>Consider the table given below:</p> <table class="table"> <tr> <td>VEGETABLE_ID</td> <td>VEGETABLE_NAME</td> <td>COLOR</td> </tr> <tr> <td>01</td> <td>Potato</td> <td>Brown</td> </tr> <tr> <td>02</td> <td>Potato</td> <td>Brown</td> </tr> <tr> <td>03</td> <td>Onion</td> <td>Red</td> </tr> <tr> <td>04</td> <td>Onion</td> <td>Red</td> </tr> <tr> <td>05</td> <td>Onion</td> <td>Red</td> </tr> <tr> <td>06</td> <td>Pumpkin</td> <td>Green</td> </tr> <tr> <td>07</td> <td>Pumpkin</td> <td>Yellow</td> </tr> </table> <br> <pre> -- create the vegetable table CREATE TABLE vegetables ( VEGETABLE_ID NUMBER generated BY DEFAULT AS ID ENTITY, VEGETABLE_NAME VARCHAR2(100), color VARCHAR2(20), PRIMARY KEY (VEGETABLE_ID) ); </pre> <br> <pre> -- insert sample rows INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Potato&apos;,&apos;Brown&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Potato&apos;,&apos;Brown&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Pumpkin&apos;,&apos;Green&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Pumpkin&apos;,&apos;Yellow&apos;); </pre> <br> <pre> -- query data from the vegetable table SELECT * FROM vegetables; </pre> <p>Suppose, we want to keep the row with the highest <strong>VEGETABLE_ID</strong> and delete all other copies.</p> <pre> SELECT MAX (VEGETABLE_ID) FROM vegetables GROUP BY VEGETABLE_NAME, color ORDER BY MAX(VEGETABLE_ID); </pre> <br> <table class="table"> <tr> <td>MAX(VEGETABLE_ID)</td> </tr> <tr> <td>2</td> </tr> <tr> <td>5</td> </tr> <tr> <td>6</td> </tr> <tr> <td>7</td> </tr> </table> <p>We use the <strong>DELETE</strong> statement to delete the rows whose values in the <strong>VEGETABLE_ID COLUMN</strong> are not the <strong>highest</strong> .</p> <pre> DELETE FROM vegetables WHERE VEGETABLE_IDNOTIN ( SELECT MAX(VEGETABLE_ID) FROM vegetables GROUP BY VEGETABLE_NAME, color ); </pre> <p>Three rows have been deleted.</p> <pre> SELECT *FROM vegetables; </pre> <br> <table class="table"> <tr> <td>VEGETABLE_ID</td> <td>VEGETABLE_NAME</td> <td>COLOR</td> </tr> <tr> <td> <strong>02</strong> </td> <td>Potato</td> <td>Brown</td> </tr> <tr> <td> <strong>05</strong> </td> <td>Onion</td> <td>Red</td> </tr> <tr> <td> <strong>06</strong> </td> <td>Pumpkin</td> <td>Green</td> </tr> <tr> <td> <strong>07</strong> </td> <td><pumpkin td> <td>Yellow</td> </pumpkin></td></tr> </table> <p>If we want to keep the row with the lowest id, use the <strong>MIN()</strong> function instead of the <strong>MAX()</strong> function.</p> <pre> DELETE FROM vegetables WHERE VEGETABLE_IDNOTIN ( SELECT MIN(VEGETABLE_ID) FROM vegetables GROUP BY VEGETABLE_NAME, color ); </pre> <p>The above method works if we have a column that is not part of the group for evaluating duplicate. If all values in the columns have copies, then we cannot use the <strong>VEGETABLE_ID</strong> column.</p> <p>Let&apos;s drop and create the <strong>vegetable</strong> table with a new structure.</p> <pre> DROP TABLE vegetables; CREATE TABLE vegetables ( VEGETABLE_ID NUMBER, VEGETABLE_NAME VARCHAR2(100), Color VARCHAR2(20) ); </pre> <br> <pre> INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(1,&apos;Potato&apos;,&apos;Brown&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(1, &apos;Potato&apos;,&apos;Brown&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color)VALUES(2,&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color)VALUES(2,&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(2,&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(3,&apos;Pumpkin&apos;,&apos;Green&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(&apos;4,Pumpkin&apos;,&apos;Yellow&apos;); SELECT * FROM vegetables; </pre> <br> <table class="table"> <tr> <td>VEGETABLE_ID</td> <td>VEGETABLE_NAME</td> <td>COLOR</td> </tr> <tr> <td>01</td> <td>Potato</td> <td>Brown</td> </tr> <tr> <td>01</td> <td>Potato</td> <td>Brown</td> </tr> <tr> <td>02</td> <td>Onion</td> <td>Red</td> </tr> <tr> <td>02</td> <td>Onion</td> <td>Red</td> </tr> <tr> <td>02</td> <td>Onion</td> <td>Red</td> </tr> <tr> <td>03</td> <td>Pumpkin</td> <td>Green</td> </tr> <tr> <td>04</td> <td>Pumpkin</td> <td>Yellow</td> </tr> </table> <p>In the vegetable table, the values in all columns <strong>VEGETABLE_ID, VEGETABLE_NAME</strong> , and color have been copied.</p> <p>We can use the <strong>rowid</strong> , a locator that specifies where Oracle stores the row. Because the <strong>rowid</strong> is unique so that we can use it to remove the duplicates rows.</p> <pre> DELETE FROM Vegetables WHERE rowed NOT IN ( SELECT MIN(rowid) FROM vegetables GROUP BY VEGETABLE_ID, VEGETABLE_NAME, color ); </pre> <p>The query verifies the deletion operation:</p> <pre> SELECT * FROM vegetables; </pre> <br> <table class="table"> <tr> <td>VEGETABLE_ID</td> <td>VEGETABLE_NAME</td> <td>COLOR</td> </tr> <tr> <td>01</td> <td>Potato</td> <td>Brown</td> </tr> <tr> <td>02</td> <td>Onion</td> <td>Red</td> </tr> <tr> <td>03</td> <td>Pumpkin</td> <td>Green</td> </tr> <tr> <td>04</td> <td>Pumpkin</td> <td>Yellow</td> </tr> </table> <hr></t2.id>

Trīs rindas tika dzēstas. Mēs izpildām tālāk sniegto vaicājumu, lai atrastu dublēti e-pasta ziņojumi no galda.

 SELECT email, COUNT (email) FROM contacts GROUP BY email HAVING COUNT (email) &gt; 1; 

Vaicājums atgriež tukšo kopu. Lai pārbaudītu datus no kontaktpersonu tabulas, izpildiet šādu SQL vaicājumu:

 SELECT * FROM contacts; 

id vārds uzvārds E-pasts vecums
7 Bens Bārnss [aizsargāts ar e-pastu] divdesmitviens
13 Braiens Svētīts [aizsargāts ar e-pastu] 18
10 Elīza Benets [aizsargāts ar e-pastu] 23
1 Kavins Pētersons [aizsargāts ar e-pastu] 22
8 Miša Bārtons [aizsargāts ar e-pastu] divdesmit
vienpadsmit Maikls Krāni [aizsargāts ar e-pastu] 17
4 Maikls Džeksons [aizsargāts ar e-pastu] 18
2 Niks Jonass [aizsargāts ar e-pastu] 16
3 Pēteris Debesis [aizsargāts ar e-pastu] 25
5 Šons Pupa [aizsargāts ar e-pastu] divdesmit
6 Toms cepējs [aizsargāts ar e-pastu] 30

Rindas id ir 9, 12 un 14 ir dzēsti. Mēs izmantojam tālāk norādīto paziņojumu, lai dzēstu rindu dublikātus:

Izpildiet skriptu veidojot kontaktpersona.

 DELETE c1 FROM contacts c1 INNERJ OIN contacts c2 WHERE c1.id &gt; c2.id AND c1.email = c2.email; 

id vārds uzvārds e-pasts vecums
1 Bens Bārnss [aizsargāts ar e-pastu] divdesmitviens
2 Kavins Pētersons [aizsargāts ar e-pastu] 22
3 Braiens Svētīts [aizsargāts ar e-pastu] 18
4 Niks Jonass [aizsargāts ar e-pastu] 16
5 Maikls Krāni [aizsargāts ar e-pastu] 17
6 Elīza Benets [aizsargāts ar e-pastu] 23
7 Maikls Džeksons [aizsargāts ar e-pastu] 18
8 Šons Pupa [aizsargāts ar e-pastu] divdesmit
9 Miša Bārtons [aizsargāts ar e-pastu] divdesmit
10 Pēteris Debesis [aizsargāts ar e-pastu] 25
vienpadsmit Toms cepējs [aizsargāts ar e-pastu] 30

(B) Dzēsiet dublētās rindas, izmantojot starptabulu

Lai dzēstu rindu dublikātu, izmantojot starptabulu, veiciet tālāk norādītās darbības.

1. darbība . Izveidojiet jaunu tabulu struktūra , tāds pats kā īstajā tabulā:

 CREATE TABLE source_copy LIKE source; 

2. darbība . Ievietojiet atšķirīgas rindas no sākotnējā datu bāzes grafika:

 INSERT INTO source_copy SELECT * FROM source GROUP BY col; 

3. darbība . Nometiet sākotnējo tabulu un pārdēvējiet tūlītējo tabulu uz sākotnējo.

 DROP TABLE source; ALTER TABLE source_copy RENAME TO source; 

Piemēram, šādi paziņojumi dzēš rindas ar dublikāts e-pasti no kontaktu tabulas:

 -- step 1 CREATE TABLE contacts_temp LIKE contacts; -- step 2 INSERT INTO contacts_temp SELECT * FROM contacts GROUP BY email; -- step 3 DROP TABLE contacts; ALTER TABLE contacts_temp RENAME TO contacts; 

(C) Dzēsiet dublētās rindas, izmantojot funkciju ROW_NUMBER().

Piezīme. Funkcija ROW_NUMBER() tiek atbalstīta kopš MySQL versijas 8.02, tāpēc pirms funkcijas izmantošanas mums ir jāpārbauda mūsu MySQL versija.

Nākamajā paziņojumā tiek izmantots ROW_NUMBER () lai katrai rindai piešķirtu secīgu veselu skaitli. Ja e-pasts ir dublēts, rinda būs augstāka par vienu.

 SELECT id, email, ROW_NUMBER() OVER (PARTITION BY email ORDER BY email ) AS row_num FROM contacts; 

Atgriežas šāds SQL vaicājums ID saraksts no dublētajām rindām:

 SELECT id FROM (SELECT id, ROW_NUMBER() OVER ( PARTITION BY email ORDER BY email) AS row_num FROM contacts ) t WHERE row_num&gt; 1; 

Izvade:

id
9
12
14

Dzēsiet dublētos ierakstus programmā Oracle

Kad tabulā atradām ierakstu dublikātus, mums bija jāizdzēš nevēlamās kopijas, lai mūsu dati būtu tīri un unikāli. Ja tabulā ir dublētās rindas, mēs varam to izdzēst, izmantojot DZĒST paziņojums, apgalvojums.

Šajā gadījumā mums ir kolonna, kas nav daļa no grupai pieraduši novērtēt uz dublikāts ieraksti tabulā.

Apsveriet tālāk sniegto tabulu:

savienojumu veidi rdbms
VEGETABLE_ID VEGETABLE_NAME KRĀSA
01 Kartupeļi Brūns
02 Kartupeļi Brūns
03 Sīpols sarkans
04 Sīpols sarkans
05 Sīpols sarkans
06 Ķirbis Zaļš
07 Ķirbis Dzeltens

 -- create the vegetable table CREATE TABLE vegetables ( VEGETABLE_ID NUMBER generated BY DEFAULT AS ID ENTITY, VEGETABLE_NAME VARCHAR2(100), color VARCHAR2(20), PRIMARY KEY (VEGETABLE_ID) ); 

 -- insert sample rows INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Potato&apos;,&apos;Brown&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Potato&apos;,&apos;Brown&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Pumpkin&apos;,&apos;Green&apos;); INSERT INTO vegetables (VEGETABLE_NAME,color) VALUES(&apos;Pumpkin&apos;,&apos;Yellow&apos;); 

 -- query data from the vegetable table SELECT * FROM vegetables; 

Pieņemsim, ka mēs vēlamies saglabāt rindu ar augstāko VEGETABLE_ID un izdzēsiet visas pārējās kopijas.

 SELECT MAX (VEGETABLE_ID) FROM vegetables GROUP BY VEGETABLE_NAME, color ORDER BY MAX(VEGETABLE_ID); 

MAKSĀLS(AUZEŅA_ID)
2
5
6
7

Mēs izmantojam DZĒST paziņojums, lai dzēstu rindas, kuru vērtības ir VEGTABLE_ID SLEJA nav tie augstākais .

 DELETE FROM vegetables WHERE VEGETABLE_IDNOTIN ( SELECT MAX(VEGETABLE_ID) FROM vegetables GROUP BY VEGETABLE_NAME, color ); 

Trīs rindas ir izdzēstas.

 SELECT *FROM vegetables; 

VEGETABLE_ID VEGETABLE_NAME KRĀSA
02 Kartupeļi Brūns
05 Sīpols sarkans
06 Ķirbis Zaļš
07 Dzeltens

Ja vēlamies saglabāt rindu ar zemāko ID, izmantojiet MIN() funkciju vietā MAX() funkciju.

 DELETE FROM vegetables WHERE VEGETABLE_IDNOTIN ( SELECT MIN(VEGETABLE_ID) FROM vegetables GROUP BY VEGETABLE_NAME, color ); 

Iepriekš minētā metode darbojas, ja mums ir kolonna, kas neietilpst dublikātu novērtēšanas grupā. Ja visām vērtībām kolonnās ir kopijas, mēs nevaram izmantot VEGETABLE_ID kolonna.

Nometīsim un izveidosim dārzenis tabula ar jaunu struktūru.

 DROP TABLE vegetables; CREATE TABLE vegetables ( VEGETABLE_ID NUMBER, VEGETABLE_NAME VARCHAR2(100), Color VARCHAR2(20) ); 

 INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(1,&apos;Potato&apos;,&apos;Brown&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(1, &apos;Potato&apos;,&apos;Brown&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color)VALUES(2,&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color)VALUES(2,&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(2,&apos;Onion&apos;,&apos;Red&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(3,&apos;Pumpkin&apos;,&apos;Green&apos;); INSERT INTO vegetables (VEGETABLE_ID,VEGETABLE_NAME,color) VALUES(&apos;4,Pumpkin&apos;,&apos;Yellow&apos;); SELECT * FROM vegetables; 

VEGETABLE_ID VEGETABLE_NAME KRĀSA
01 Kartupeļi Brūns
01 Kartupeļi Brūns
02 Sīpols sarkans
02 Sīpols sarkans
02 Sīpols sarkans
03 Ķirbis Zaļš
04 Ķirbis Dzeltens

Dārzeņu tabulā vērtības visās kolonnās VEGETABLE_ID, VEGETABLE_NAME , un krāsa ir nokopēta.

Mēs varam izmantot dusmīgs , vietrādis, kas norāda, kur Oracle glabā rindu. Tāpēc ka dusmīgs ir unikāls, lai mēs to varētu izmantot rindu dublikātu noņemšanai.

 DELETE FROM Vegetables WHERE rowed NOT IN ( SELECT MIN(rowid) FROM vegetables GROUP BY VEGETABLE_ID, VEGETABLE_NAME, color ); 

Vaicājums pārbauda dzēšanas darbību:

 SELECT * FROM vegetables; 

VEGETABLE_ID VEGETABLE_NAME KRĀSA
01 Kartupeļi Brūns
02 Sīpols sarkans
03 Ķirbis Zaļš
04 Ķirbis Dzeltens