Из документации PostgreSQL :
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
[ * | expression [ [ AS ] output_name ] [, ...] ]
В первой строке этого цитируемого синтаксиса вы найдете, что часть ON является необязательной, , но , это также та часть ON , которая ссылается на скобки. Другими словами, если ON не присутствует, то круглые скобки не имеют смысла.
Итак, для этого вопроса [ON (выражение [, ...])] не имеет отношения .
Вот несколько очень простых тестовых данных:
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')
;
Давайте сначала сконцентрируемся на скобках. Что делают только круглые скобки вокруг выражения после выбора? например, * +1025 *
select (foo) from bar;
| foo |
|-----|
| one |
| one |
| one |
| two |
| two |
| two |
Я надеюсь, что вы увидите, что этот результат идентичен запросу без скобок, окружающих столбец foo , и поэтому мы находим из этого запроса, что скобки НИЧЕГО не делают. Они просто игнорируются. Что произойдет, если мы введем DISTINCT?
select distinct(foo) from bar;
| foo |
|-----|
| two |
| one |
select distinct foo from bar;
| foo |
|-----|
| two |
| one |
Опять же, мы видим, что скобки не имеют никакого эффекта вообще. Если мы вернемся к синтаксису, это согласуется. DISTINCT НЕ является ФУНКЦИЕЙ и размещение выражения в скобках после DISTINCT не меняет способ его работы.
Итак, на вопрос:
только что натолкнулся на SQL-запрос, в частности, к базе данных Postgres, в которой используется функция с именем «Different». А именно:
select distinct(pattern) as pattern, style, ... etc ...
from styleview
where ... etc ...
DISTINCT НЕ является функцией! и круглые скобки в этом примере запроса игнорируются .
Если используется необязательный [ON (выражение)] действительно меняет результаты.
Тест :
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 |
Испытание 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 |
Испытание 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 |
Функция [ON (выражение)] очень полезна, поскольку она может предоставлять «первые», «последние», «самые ранние» или «самые последние» строки в отдельном списке. Но имейте в виду, что эта возможность связана с предложением ORDER BY и фактически, если только предложение order by ALSO не ссылается на выражения, используемые в SELECT DISTINCT ON PostgreSQL, выдает ошибку:
ОШИБКА: выражения SELECT DISTINCT ON должны соответствовать начальному ORDER BY
выражения
Приведенные выше примеры можно увидеть на sqlfiddle здесь
Хотя я не хочу слишком усложнять свой ответ, есть морщина, о которой стоит упомянуть:
select distinct (foo,fub) from bar;
СЕЙЧАС скобки что-то делают , но то, что они делают, не имеет прямого отношения к разным. Смотрите " сложные типы "