Unter Verwendung von distinct auf eine Spalte und tun, um auf eine andere Spalte gibt einen Fehler
Ich habe eine Tabelle:
abc_test mit Spalten n_num, k_str.
Diese Abfrage funktioniert nicht:
select distinct(n_num) from abc_test order by(k_str)
Aber dieses funktioniert:
select n_num from abc_test order by(k_str)
Wie DISTINCT und ORDER BY keywords intern, Ausgabe von sowohl der Abfragen geändert wird?
- Könnten Sie zeigen die Ergebnisse auf, wenn Sie diese zwei Abfragen? Die erste Abfrage gibt einen Fehler zurück
ORA-01791: not a SELECTed expression
alsk_str
Spalte ist nicht aktiviert. Ist das die tatsächliche Abfrage, die Sie lief? (Kann es akzeptabel sein, 9i, aber ich kann nicht sicher sein.) - Gleiche Wirkung auf den SQL Server, aber mit einer aussagekräftigeren Fehlermeldung "ORDER BY-Elemente müssen in der Auswahlliste angezeigt werden, wenn SELECT DISTINCT angegeben wird."
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit ich das verstanden von deiner Frage .
Verschieden :- mittels select ein distinct(alle ausgewählten Werte sollten eindeutig sein).
Bestellung Von :- einfach-Mittel zu, um die ausgewählten Zeilen wie pro Ihre Anforderung .
Das problem in deiner ersten Abfrage
Zum Beispiel :
Ich habe eine Tabelle
nun die Abfrage
select distinct(ID) from table order by (name)
verwirrt ist, welchen Datensatz es sollte für ID - 04 (da zwei Werte sind es,d und a in der Spalte Name). Also ist das problem für die DB-engine ist hier, wenn Sie sagenBestellung durch (name).........
Denken Sie möglicherweise über die Verwendung von group by statt:
order by min(k_str)
ist eine andere Sache, dieorder by k_str
Die erste Abfrage ist unmöglich.
Hiermit erklären dies durch ein Beispiel. wir haben diesen test:
select distinct (n_num) from abc_test
istSelect n_num from abc_test order by k_str
istWas willst du zurück
select distinct (n_num) from abc_test order by k_str
?sollte es wieder nur 1 und 2, aber wie kann man Sie bestellen?
select distinct (n_num) as iresult from abc_test ORDER BY iresult ASC
select distinct n_num from abc_test order by 1
n_num
sind deutlich in der Tabelle, liegt der Fehler immer noch auftreten? Wenn dem so ist, ändert sich dadurch Ihre Schlussfolgerungen?Wählen Sie die Sammlung von distinct(n_num) aus der Ergebnismenge, die aus der Abfrage. Es besteht also keine tatsächliche Beziehung mit der Spalte k_str mehr. Ein n_num kann aus zwei Zeilen mit je einem unterschiedlichen Wert für k_str. Man kann also nicht um die Sammlung von distinct(n_num) von k_str.
Laut SQL-Standards, eine
SELECT
- Klausel beziehen kann, entweder als Klauseln ("Aliase") in der top-level -SELECT
Klausel oder Spalten der Ergebnismenge, die durch die ordinale position, und daher nether Ihre Abfragen würde, kompatibel sein.Scheint es Oracle, gemeinsam mit anderen SQL implemetations, können Sie auf Spalten verweisen, die gab es (logischerweise) auch unmittelbar vor der projizierte Weg in die
SELECT
- Klausel. Ich bin mir nicht sicher, ob eine solche Flexibilität ist eine gute Sache: IMO ist es gute Praxis zu entlarven, um die Sortierreihenfolge zu der aufrufenden Anwendung, indem Sie die Spalte/Ausdrücke etc. in derSELECT
- Klausel.Als je zuvor, Sie müssen, um dsicpline um sinnvolle Ergebnisse. Für Ihre erste Abfrage, die definition der Reihenfolge ist möglicherweise völlig willkürlich.Sie sollten dankbar sein für die Fehler 😉
Dieser Ansatz ist in SQL server 2000 verfügbar, Sie können select distinct Werte aus einer Tabelle und, um durch die verschiedenen Spalte, die nicht enthalten ist, Deutlich.
Aber in SQL 2012 wird dieser durch einen Fehler,
"ORDER BY-Elemente müssen in der Auswahlliste angezeigt werden, wenn SELECT DISTINCT angegeben wird."
So, immer noch, wenn Sie wollen, verwenden Sie die gleichen Funktionen wie der SQL 2000-Sie können die Spalte Anzahl für die Bestellung(Ihren nicht zu empfehlen beste Praxis).
Dieser wird, um die erste Spalte nach Holen das Ergebnis. Wenn Sie möchten, dass die Bestellung erfolgen sollte, basierend auf verschiedenen andere Spalte als eindeutigen, dann müssen Sie hinzufügen, dass die Spalte auch in der select-Anweisung und verwenden Sie die Spalte Anzahl auf Bestellung durch.
Wie extended sort key columns
Den logische Reihenfolge von Operationen in SQL für Ihre erste Abfrage, ist (vereinfacht):
FROM abc_test
SELECT n_num, k_str
D. H. fügen Sie einen so genannten erweitert Sortierschlüssel SpalteORDER BY k_str DESC
SELECT n_num
D. H. entfernen der erweitert Sortierschlüssel Spalte wieder vom Ergebnis.Dank der SQL-standard erweitert Sortierschlüssel Spalte Funktion ist es möglich, die Bestellung von etwas, das nicht in der
SELECT
- Klausel, denn es wird nur vorübergehend Hinzugefügt, um es hinter den kulissen vor der Bestellung, und dann wieder entfernt nach der Bestellung.Also, warum funktioniert das nicht mit
DISTINCT
?Wenn wir hinzufügen, die
DISTINCT
Betrieb, es müsste Hinzugefügt werden, zwischenSELECT
undORDER BY
:FROM abc_test
SELECT n_num, k_str
D. H. fügen Sie einen so genannten erweitert Sortierschlüssel SpalteDISTINCT
ORDER BY k_str DESC
SELECT n_num
D. H. entfernen der erweitert Sortierschlüssel Spalte wieder vom Ergebnis.Aber jetzt, mit der erweitert Sortierschlüssel Spalte
k_str
, die Semantik derDISTINCT
Betrieb geändert wurde, so das Ergebnis wird nicht mehr dasselbe sein. Dies ist nicht das, was wir wollen, also sowohl der SQL standard, und alle vernünftigen Datenbanken verbieten diese Nutzung ein.Workarounds
PostgreSQL hat die
DISTINCT ON
syntax, die hier verwendet werden können für genau diesen job:Kann emuliert werden, mit der standard-syntax wie folgt vor, wenn Sie nicht mit PostgreSQL
Oder einfach nur (in diesem Fall)
Ich habe darüber gebloggt, SQL DISTINCT und ORDER BY mehr im detail hier.
Meine Abfrage nicht mit den Ihren übereinstimmen genau, aber es ist ziemlich nah.
hast du das probiert?
können Sie tun
Wenn ich die gleichen Fehler, ich habe es gelöst, indem es als