Das Schlüsselwort „distinct“ wird verwendet, um redundante doppelte Datensätze herauszufiltern und nur einen zu behalten. Oft wird es jedoch nur verwendet, um die Anzahl eindeutiger Datensätze zurückzugeben, anstatt alle Werte eindeutiger Datensätze zurückzugeben. Der Grund dafür ist, dass Distinct nur durch eine Doppelschleifenabfrage gelöst werden kann, was sich zweifellos direkt auf die Effizienz einer Website mit einer sehr großen Datenmenge auswirkt.
Schauen wir uns das Beispiel an:
Tabelle Tabelle
Feld 1 Feld 2 ID 1 Name a 2 b 3 c 4 c 5 b
Die Struktur ist ungefähr so. Dies ist nur ein einfaches Beispiel. Die tatsächliche Situation wird viel komplizierter sein.
Wenn ich beispielsweise eine Anweisung verwenden möchte, um alle Daten mit nicht doppelten Namen abzufragen, muss ich „distinct“ verwenden, um redundante doppelte Datensätze zu entfernen.
eindeutigen Namen aus der Tabelle auswählen Das Ergebnis ist:
----------
Name a b c
Es scheint den Effekt erzielt zu haben, aber was ich erhalten möchte, ist der ID-Wert? Ändern Sie die Abfrageanweisung:
Wählen Sie einen eindeutigen Namen und eine eindeutige ID aus der Tabelle aus
Das Ergebnis ist:
----------
ID-Name 1 a 2 b 3 c 4 c 5 b
Warum funktioniert die Unterscheidung nicht? Es funktioniert, wirkt sich jedoch auf zwei Felder gleichzeitig aus, d. h. die ID und der Name müssen identisch sein, um ausgeschlossen zu werden. . . . . . .
Ändern wir die Abfrageanweisung:
wählen Sie ID, eindeutiger Name aus Tabelle aus
Leider erhalten Sie nichts außer Fehlermeldungen, eindeutig muss an den Anfang gestellt werden. Ist es so schwierig, die Where-Bedingung eindeutig zu definieren? Ja, es wird immer noch ein Fehler gemeldet.
---------------- ------ -------------------------------------------- ------ ----------------
Die folgende Methode ist ebenfalls nicht möglich:
wählen Sie * , count(eindeutiger Name) aus der Tabellengruppe nach Namen
Ergebnis:
ORA-00979: kein GROUP BY-Ausdruck
00979 - „kein Ausdruck „GRUPPE NACH“
Es wird immer noch ein Fehler gemeldet,
Gruppieren nach muss vor „Bestellen nach“ und „Limit“ platziert werden, andernfalls wird ein Fehler gemeldet
--- ----------------------------------- -------------- ----------------------------------- --------------- -----
Ich denke, das ist machbar
select max(id), name aus der Tabellengruppe nach Namen;
Ergebnis:
ID-Name
1 a
2 b
4 c
5 d