Z PostgreSQL documentation:
SELECT [ ALL | DISTINCT [ ON (expression [, ...]) ] ]
[ * | expression [ [ AS ] output_name ] [, ...] ]
W pierwszym wierszu tego cytowanego składni będzie można zauważyć, że ON części jest opcjonalny, ale jest również, że ON części który odwołuje nawiasów. Innymi słowy, jeśli ON nie występuje, nawiasy są bez znaczenia.
Więc na to pytanie[ON (wyrażenie [...])]nie ma znaczenia.
Oto bardzo prosty danych testowych:
CREATE TABLE bar
(foo varchar(3), fub varchar(1), flut timestamp)
;
INSERT INTO bar
(foo, fub, flut)
VALUES
('one', 'a', '2016-01-01 01:01:03'),
('one', 'b', '2016-01-01 01:01:02'),
('one', 'c', '2016-01-01 01:01:01'),
('two', 'd', '2016-01-01 01:01:03'),
('two', 'e', '2016-01-01 01:01:02'),
('two', 'f', '2016-01-01 01:01:01')
;
Niech najpierw skoncentrować się na nawiasach. Co robią same nawiasy wokół wyrażenia po wybraniu? na przykład
select (foo) from bar;
| foo |
|-----|
| one |
| one |
| one |
| two |
| two |
| two |
Ufam, że widać, że ten wynik jest identyczny kwerendy bez nawiasów wokół kolumny foo, a więc to, co znajdujemy z tego zapytania jest to, że nawiasy nic nie robić. Są po prostu ignorowane. Co się stanie, jeśli wprowadzimy DISTINCT?
select distinct(foo) from bar;
| foo |
|-----|
| two |
| one |
select distinct foo from bar;
| foo |
|-----|
| two |
| one |
Ponownie widzimy, że nawiasy nie mają żadnego efektu. Jeśli odnosimy się do składni, jest to spójne. DISTINCT NIE JEST FUNKCJĄ i umieszczenie wyrażenia wewnątrz nawiasów za DISTINCT nie zmienia sposobu działania.
Tak więc, na pytanie:
just came across a SQL query, specifically against a Postgres database, that uses a function named "distinct". Namely:
select distinct(pattern) as pattern, style, ... etc ...
from styleview
where ... etc ...
DISTINCT nie jest funkcją! i nawiasy w tym przykładowym zapytaniu są ignorowane.
Jeśli używany jest opcjonalny [ON (wyrażenie)] naprawdę nie zmienia wyników.
Test a:
select distinct ON (foo) foo, fub, flut from bar order by foo
| foo | fub | flut |
|-----|-----|---------------------------|
| one | a | January, 01 2016 01:01:03 |
| two | d | January, 01 2016 01:01:03 |
Test b:
select distinct ON (fub) foo, fub, flut from bar order by fub
| foo | fub | flut |
|-----|-----|---------------------------|
| one | a | January, 01 2016 01:01:03 |
| one | b | January, 01 2016 01:01:02 |
| one | c | January, 01 2016 01:01:01 |
| two | d | January, 01 2016 01:01:03 |
| two | e | January, 01 2016 01:01:02 |
| two | f | January, 01 2016 01:01:01 |
Test c:
select distinct ON (flut) foo, fub, flut from bar order by flut
| foo | fub | flut |
|-----|-----|---------------------------|
| one | c | January, 01 2016 01:01:01 |
| one | b | January, 01 2016 01:01:02 |
| one | a | January, 01 2016 01:01:03 |
Obiekt [ON (expression)] jest bardzo przydatny, ponieważ może udostępniać "pierwsze", "ostatnie" lub "najwcześniejsze" lub "najnowsze" wiersze na odrębnej liście. Należy jednak pamiętać, że ta funkcja jest sprzężony z klauzuli ORDER BY i faktycznie chyba że klauzula ORDER BY odnosi się również do wyrażeń stosowanych w SELECT DISTINCT ON PostgreSQL generuje błąd:
ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
Powyższe przykłady mogą być widziany pracy przy sqlfiddle here
Chociaż nie chcą komplikować nad moją odpowiedź istnieje zmarszczek warto wspomnieć:
select distinct (foo,fub) from bar;
TERAZ nawiasy coś robią, ale to, co robią, nie ma bezpośredniego związku z wyraźnym. Zobacz "complex types"
Dawno już opuściłem firmę, w której pojawił się ten problem i nie mam teraz Postgresa przydatnego. Ale twoja odpowiedź brzmi wiarygodny. Zgaduję, że albo pierwotny programista chciał powiedzieć "włączony" i przypadkowo go pominął, albo pierwotnie było coś innego w nawiasach i to zostało uproszczone aż do "wzoru", zrobić nawiasy i "jak" zbędny. – Jay