Din fråga är helt laglig syntax, du kan sortera efter kolumner som inte finns i urvalet.
- Fungerande demo med MySQL
- Arbetande demo med SQL Server
- Fungerande demo med Postgresql
- Arbetande demo med SQLite
- Arbetande demo med Oracle
Om du behöver de fullständiga specifikationerna för juridisk ordning, har den i SQL Standard 2003 en lång lista med uttalanden om vad ordningen av bör och inte bör innehålla, (02-Foundation, sida 415, avsnitt 7.13
Jag tror att din förvirring kan bero på att du väljer och/eller sorterar efter kolumner som inte finns i gruppen efter, eller sorterar efter kolumner som inte finns i urvalet när du använder distinkt.
Båda har samma grundläggande problem, och MySQL är den enda som jag vet som tillåter antingen.
Problemet är detta, att när du använder grupp efter eller distinkt, behövs inga kolumner som inte finns i någondera, så det spelar ingen roll om de har flera olika värden över rader eftersom de aldrig behövs. Föreställ dig denna enkla datauppsättning:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
3 | B | Y |
Om du skriver:
SELECT DISTINCT Column1
FROM T;
Du skulle få
Column1
---------
A
B
Om du sedan lägger till ORDER BY Column2
, vilken av de två kolumn2 skulle du använda för att beställa A efter, X eller Z? Det är inte deterministiskt hur man väljer ett värde för kolumn2.
Detsamma gäller för att välja kolumner som inte ingår i gruppen efter. För att förenkla, föreställ dig bara de två första raderna i föregående tabell:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
I MySQL kan du skriva
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1;
Detta bryter faktiskt SQL-standarden, men det fungerar i MySQL, men problemet är att det är icke-deterministiskt, resultatet:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
Är varken mer eller mindre korrekt än
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
Så det du säger är att ge mig en rad för varje distinkt värde på Column1
, vilka båda resultatuppsättningarna uppfyller, så hur vet du vilken du kommer att få? Det gör du inte, det verkar vara en ganska populär missuppfattning att du kan lägga till och ORDER BY
klausul för att påverka resultaten, så till exempel följande fråga:
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1
ORDER BY ID DESC;
Skulle se till att du får följande resultat:
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
på grund av ORDER BY ID DESC
, men detta är inte sant (som visas här
).
MySQL-dokumenten ange:
Så även om du har en ordning gäller detta inte förrän efter att en rad per grupp har valts, och den här raden är icke-deterministisk.
SQL-standarden tillåter kolumner i urvalslistan som inte finns i GROUP BY eller en aggregerad funktion, men dessa kolumner måste vara funktionellt beroende av en kolumn i GROUP BY. Från SQL-2003-Standard (5WD-02-Foundation-2003-09 - sida 346) - http ://www.wiscorp.com/sql_2003_standard.zip
Till exempel är ID i exempeltabellen PRIMÄRNYCKELN, så vi vet att den är unik i tabellen, så följande fråga överensstämmer med SQL-standarden och skulle köras i MySQL och misslyckas i många DBMS för närvarande (I skrivande stund Postgresql är det närmaste DBMS jag känner till att korrekt implementera standarden - Exempel här ):
SELECT ID, Column1, Column2
FROM T
GROUP BY ID;
Eftersom ID är unikt för varje rad kan det bara finnas ett värde för Column1
för varje ID, ett värde av Column2
det finns ingen tvetydighet om vad som ska returneras för varje rad.