Twoje zapytanie ma całkowicie legalną składnię, możesz uporządkować je według kolumn, których nie ma w zaznaczeniu.
Jeśli potrzebujesz pełnej specyfikacji na temat porządków prawnych, w SQL Standard 2003 znajduje się długa lista oświadczeń o tym, według czego kolejność powinna, a czego nie powinna zawierać (02-Foundation, strona 415, sekcja 7.13
Myślę, że Twoje zamieszanie może wynikać z wybierania i/lub porządkowania według kolumn, których nie ma w grupie według lub porządkowania według kolumn, których nie ma w zaznaczeniu, gdy używasz odrębnego.
Oba mają ten sam podstawowy problem, a MySQL jest jedynym, o ile wiem, który pozwala na oba.
Problem polega na tym, że podczas korzystania z funkcji grupuj według lub odrębnie wszystkie kolumny, które nie są zawarte w żadnej z nich, nie są potrzebne, więc nie ma znaczenia, czy mają wiele różnych wartości w wierszach, ponieważ nigdy nie są potrzebne. Wyobraź sobie ten prosty zestaw danych:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
3 | B | Y |
Jeśli piszesz:
SELECT DISTINCT Column1
FROM T;
Dostaniesz
Column1
---------
A
B
Jeśli następnie dodasz ORDER BY Column2
, której z dwóch kolumn 2 użyjesz do uporządkowania A według, X lub Z? Wybór wartości dla kolumny 2 nie jest deterministyczny.
To samo dotyczy zaznaczania kolumn spoza grupy wg. Dla uproszczenia wyobraź sobie pierwsze dwa rzędy poprzedniej tabeli:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
W MySQL możesz pisać
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1;
To faktycznie łamie standard SQL, ale działa w MySQL, jednak problem polega na tym, że nie jest deterministyczny, wynik:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
Jest nie mniej lub bardziej poprawny niż
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
Więc mówisz, że daj mi jeden wiersz dla każdej odrębnej wartości Column1
, które oba zestawy wyników spełniają, więc skąd masz wiedzieć, który otrzymasz? Cóż, nie wiesz, wydaje się, że jest to dość popularne błędne przekonanie, że możesz dodać i ORDER BY
klauzula wpływająca na wyniki, więc na przykład następujące zapytanie:
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1
ORDER BY ID DESC;
Zapewniłoby to uzyskanie następującego wyniku:
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
ze względu na ORDER BY ID DESC
, jednak nie jest to prawdą (jak pokazano tutaj
).
dokumenty MySQL stan:
Więc nawet jeśli masz takie zamówienie, nie ma to zastosowania, dopóki nie zostanie wybrany jeden wiersz na grupę, a ten jeden wiersz nie jest deterministyczny.
SQL-Standard dopuszcza kolumny z listy wyboru, które nie są zawarte w funkcji GROUP BY lub w funkcji agregującej, jednak te kolumny muszą być funkcjonalnie zależne od kolumny w GROUP BY. Ze standardu SQL-2003-Standard (5WD-02-Foundation-2003-09 — strona 346) — http ://www.wiscorp.com/sql_2003_standard.zip
Na przykład ID w przykładowej tabeli to PRIMARY KEY, więc wiemy, że jest on unikalny w tabeli, więc poniższe zapytanie jest zgodne ze standardem SQL i działałoby w MySQL i nie działałoby obecnie w wielu DBMS (w momencie pisania Postgresql jest najbliższym DBMS, jaki znam, aby poprawnie wdrożyć standard - Przykład tutaj ):
SELECT ID, Column1, Column2
FROM T
GROUP BY ID;
Ponieważ identyfikator jest unikalny dla każdego wiersza, może być tylko jedna wartość Column1
dla każdego identyfikatora jedna wartość Column2
nie ma dwuznaczności co do tego, co zwrócić dla każdego wiersza.