sql >> Databasteknik >  >> RDS >> Database

Hur man tar bort dubbletter i SQL

Introduktion

  • Det finns några specifika regler som måste följas när du skapar databasobjekten. För att förbättra prestandan för en databas bör en primärnyckel, klustrade och icke-klustrade index och begränsningar tilldelas en tabell. Även om vi följer alla dessa regler kan dubbletter av rader fortfarande förekomma i en tabell.
  • Det är alltid bra att använda databasnycklarna. Genom att använda databasnycklarna minskar du chansen att få dubbletter av poster i en tabell. Men om dubblettposter redan finns i en tabell, finns det specifika sätt som används för att ta bort dessa dubblettposter.

Sätt att ta bort dubbletter av rader

  • Användning av DELETE JOIN uttalande för att ta bort dubbletter av rader

DELETE JOIN-satsen finns i MySQL som hjälper till att ta bort dubbletter av rader från en tabell.

Tänk på en databas med namnet "studentdb". Vi kommer att skapa en tabellstudent i den.

mysql> USE studentdb;
Database changed
mysql> CREATE TABLE student (Stud_ID INT, Stud_Name VARCHAR(20), Stud_City VARCHAR(20), Stud_email VARCHAR(255), Stud_Age INT);
Query OK, 0 rows affected (0.15 sec)

Vi har skapat en 'student'-tabell i 'studentdb'-databasen.

Nu kommer vi att skriva följande frågor för att infoga data i elevtabellen.

mysql> INSERT INTO student VALUES (1, "Ankit", "Nagpur", "[email protected]", 32);
Query OK, 1 row affected (0.08 sec)


mysql> INSERT INTO student VALUES (2, "Soham", "Nanded", "[email protected]", 35);
Query OK, 1 row affected (0.08 sec)


mysql> INSERT INTO student VALUES (3, "Soham", "Nanded", "[email protected]", 26);
Query OK, 1 row affected (0.04 sec)


mysql> INSERT INTO student VALUES (4, "Ravi", "Chandigarh", "[email protected]", 19);
Query OK, 1 row affected (0.09 sec)


mysql> INSERT INTO student VALUES (5, "Ravi", "Chandigarh", "[email protected]", 19);
Query OK, 1 row affected (0.09 sec)


mysql> INSERT INTO student VALUES (6, "Shyam", "Dehradun", "[email protected]", 22);
Query OK, 1 row affected (0.09 sec)


mysql> INSERT INTO student VALUES (7, "Manthan", "Ambala", "[email protected]", 24);
Query OK, 1 row affected (0.08 sec)


mysql> INSERT INTO student VALUES (8, "Neeraj", "Noida", "[email protected]", 25);
Query OK, 1 row affected (0.04 sec)


mysql> INSERT INTO student VALUES (9, "Anand", "Kashmir", "[email protected]", 20);
Query OK, 1 row affected (0.07 sec)


mysql> INSERT INTO student VALUES (10, "Raju", "Shimla", "[email protected]", 29);
Query OK, 1 row affected (0.13 sec)


mysql> INSERT INTO student VALUES (11, "Raju", "Shimla", "[email protected]", 29);
Query OK, 1 row affected (0.08 sec)

Nu kommer vi att hämta alla poster från elevbordet. Vi kommer att överväga den här tabellen och databasen för alla följande exempel.

mysql> SELECT *FROM student;
+---------+-----------+------------+-------------------------+----------+
| Stud_ID | Stud_Name | Stud_City  | Stud_email              | Stud_Age |
+---------+-----------+------------+-------------------------+----------+
|       1 | Ankit     | Nagpur     | [email protected]       |       32 |
|       2 | Soham     | Nanded     | [email protected]       |       35 |
|       3 | Soham     | Nanded     | [email protected]       |       26 |
|       4 | Ravi      | Chandigarh | [email protected]         |       19 |
|       5 | Ravi      | Chandigarh | [email protected]         |       19 |
|       6 | Shyam     | Dehradun   | [email protected]     |       22 |
|       7 | Manthan   | Ambala     | [email protected] |       24 |
|       8 | Neeraj    | Noida      | [email protected]   |       25 |
|       9 | Anand     | Kashmir    | [email protected]        |       20 |
|      10 | Raju      | Shimla     | [email protected]         |       29 |
|      11 | Raju      | Shimla     | [email protected]         |       29 |
+---------+-----------+------------+-------------------------+----------+
11 rows in set (0.00 sec)

Exempel 1:

Skriv en fråga för att ta bort dubbletter av rader från elevtabellen med hjälp av RADERA JOIN uttalande.

mysql> DELETE s1 FROM student s1 INNER JOIN student s2 WHERE s1.Stud_ID < s2.Stud_ID AND s1.Stud_email = s2.Stud_email;

Vi har använt DELETE-frågan med INNER JOIN. För att implementera INNER JOIN på en enda tabell har vi skapat två instanser s1 och s2. Sedan har vi med hjälp av WHERE-satsen kontrollerat två villkor för att ta reda på dubblettraderna i elevtabellen. Om e-post-id:t i två olika poster är detsamma och student-id:t är olika, kommer det att behandlas som en dubblettpost enligt WHERE-klausulens villkor.

Utdata:

Query OK, 3 rows affected (0.20 sec)

Resultaten av ovanstående fråga visar att det finns tre dubbletter av poster i elevtabellen.

Vi kommer att använda SELECT-frågan för att hitta dubblettposterna som raderades.

mysql> SELECT *FROM student;
+---------+-----------+------------+-------------------------+----------+
| Stud_ID | Stud_Name | Stud_City  | Stud_email              | Stud_Age |
+---------+-----------+------------+-------------------------+----------+
|       1 | Ankit     | Nagpur     | [email protected]       |       32 |
|       3 | Soham     | Nanded     | [email protected]       |       26 |
|       5 | Ravi      | Chandigarh | [email protected]         |       19 |
|       6 | Shyam     | Dehradun   | [email protected]     |       22 |
|       7 | Manthan   | Ambala     | [email protected] |       24 |
|       8 | Neeraj    | Noida      | [email protected]   |       25 |
|       9 | Anand     | Kashmir    | [email protected]        |       20 |
|      11 | Raju      | Shimla     | [email protected]         |       29 |
+---------+-----------+------------+-------------------------+----------+
8 rows in set (0.00 sec)

Nu finns det bara 8 poster som finns i elevtabellen eftersom de tre dubblettposterna raderas från den för närvarande valda tabellen. Enligt följande villkor:

s1.Stud_ID < s2.Stud_ID AND s1.Stud_email = s2.Stud_email;

Om e-post-ID:n för två poster är desamma, då mindre än-tecknet används mellan student-id:n, kommer endast posten med större anställd-ID att bevaras, och den andra dubblettposten kommer att raderas mellan de två posterna.

Exempel 2:

Skriv en fråga för att ta bort dubblettrader från elevtabellen med hjälp av delete join-satsen samtidigt som du behåller dubblettposten med ett mindre anställd-id och raderar den andra.

mysql> DELETE s1 FROM student s1 INNER JOIN student s2 WHERE s1.Stud_ID > s2.Stud_ID AND s1.Stud_email = s2.Stud_email;

Vi har använt DELETE-frågan med INNER JOIN. För att implementera INNER JOIN på en enda tabell har vi skapat två instanser s1 och s2. Sedan har vi med hjälp av WHERE-satsen kontrollerat två villkor för att ta reda på dubblettraderna i elevtabellen. Om e-post-id:t som finns i två olika poster är detsamma och student-id är olika, kommer det att behandlas som en dubblettpost enligt WHERE-klausulens villkor.

Utdata:

Query OK, 3 rows affected (0.09 sec)

Resultaten av ovanstående fråga visar att det finns tre dubbletter av poster i elevtabellen.

Vi kommer att använda SELECT-frågan för att hitta dubblettposterna som raderades.

mysql> SELECT *FROM student;
+---------+-----------+------------+-------------------------+----------+
| Stud_ID | Stud_Name | Stud_City  | Stud_email              | Stud_Age |
+---------+-----------+------------+-------------------------+----------+
|       1 | Ankit     | Nagpur     | [email protected]       |       32 |
|       2 | Soham     | Nanded     | [email protected]       |       35 |
|       4 | Ravi      | Chandigarh | [email protected]         |       19 |
|       6 | Shyam     | Dehradun   | [email protected]     |       22 |
|       7 | Manthan   | Ambala     | [email protected] |       24 |
|       8 | Neeraj    | Noida      | [email protected]   |       25 |
|       9 | Anand     | Kashmir    | [email protected]        |       20 |
|      10 | Raju      | Shimla     | [email protected]         |       29 |
+---------+-----------+------------+-------------------------+----------+
8 rows in set (0.00 sec)

Nu finns det bara 8 poster som finns i elevtabellen eftersom de tre dubblettposterna raderas från den för närvarande valda tabellen. Enligt följande villkor:

s1.Stud_ID > s2.Stud_ID AND s1.Stud_email = s2.Stud_email;

Om e-post-ID:t för två poster är desamma eftersom större än-tecknet används mellan student-id:t kommer endast posten med det mindre anställd-id:t att bevaras, och den andra dubblettposten kommer att raderas bland de två posterna.

  • Användning av en mellantabell för att ta bort dubbletter av rader

Följande steg bör följas när du tar bort dubblettraderna med hjälp av en mellantabell.

  1. En ny tabell bör skapas, som är densamma som den faktiska tabellen.
  2. Lägg till distinkta rader från den faktiska tabellen till den nyskapade tabellen.
  3. Släpp den faktiska tabellen och byt namn på den nya tabellen med samma namn som en faktisk tabell.

Exempel:

Skriv en fråga för att ta bort dubblettposterna från elevtabellen genom att använda en mellantabell.

Steg 1:

Först kommer vi att skapa en mellantabell som kommer att vara samma som medarbetartabellen.

mysql> CREATE TABLE temp_student LIKE student;
Query OK, 0 rows affected (0.14 sec)

Här är 'anställd' den ursprungliga tabellen och 'temp_student' är den mellanliggande tabellen.

Steg 2:

Nu kommer vi bara att hämta de unika posterna från elevtabellen och infoga alla hämtade poster i temp_student-tabellen.

mysql> INSERT INTO temp_student SELECT *FROM student GROUP BY Stud_email;
Query OK, 8 rows affected (0.12 sec)
Records: 8  Duplicates: 0  Warnings: 0

Här, innan de distinkta posterna från elevtabellen infogas i temp_student, filtreras alla dubbletter av posterna av Stud_email. Sedan är det bara posterna med unikt e-post-id som har infogats i temp_student.

Steg 3:

Sedan tar vi bort elevtabellen och byter namn på tabellen temp_student till elevtabellen.

mysql> DROP TABLE student;
Query OK, 0 rows affected (0.08 sec)
mysql> ALTER TABLE temp_student RENAME TO student;
Query OK, 0 rows affected (0.08 sec)

Elevtabellen har tagits bort och temp_student byter namn till elevtabellen, som bara innehåller de unika posterna.

Sedan måste vi verifiera att elevtabellen nu bara innehåller de unika posterna. För att verifiera detta har vi använt SELECT-frågan för att se data som finns i elevtabellen.

mysql> SELECT *FROM student;

Utdata:

+---------+-----------+------------+-------------------------+----------+
| Stud_ID | Stud_Name | Stud_City  | Stud_email              | Stud_Age |
+---------+-----------+------------+-------------------------+----------+
|       9 | Anand     | Kashmir    | [email protected]        |       20 |
|       1 | Ankit     | Nagpur     | [email protected]       |       32 |
|       7 | Manthan   | Ambala     | [email protected] |       24 |
|       8 | Neeraj    | Noida      | [email protected]   |       25 |
|      10 | Raju      | Shimla     | [email protected]         |       29 |
|       4 | Ravi      | Chandigarh | [email protected]         |       19 |
|       6 | Shyam     | Dehradun   | [email protected]     |       22 |
|       2 | Soham     | Nanded     | [email protected]       |       35 |
+---------+-----------+------------+-------------------------+----------+
8 rows in set (0.00 sec)

Nu finns det bara 8 poster som finns i elevtabellen eftersom de tre dubblettposterna raderas från den för närvarande valda tabellen. I steg 2, medan man hämtade de distinkta posterna från den ursprungliga tabellen och infogade dem i en mellantabell, användes en GROUP BY-sats på Stud_email, så alla poster infogades baserat på elevernas e-post-ID. Här hålls endast posten med ett lägre anställd-id bland dubblettposterna som standard, och den andra raderas.


  1. Array i IN()-satsen oracle PLSQL

  2. Oracle-partition efter nyckelord

  3. Varför primärnycklar är viktiga och hur man väljer en

  4. Använd OBJECTPROPERTY() för att ta reda på om ett objekt är en CHECK-begränsning i SQL Server