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')
;
まず、括弧に注目しましょう。select に続く式を括弧だけで囲んで何をしますか? 例えば
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 は FUNCTIONではなく、DISTINCT の後の括弧内に式を配置しても、その動作は変わりません。
だから、質問のために:
「distinct」という名前の関数を使用する、特に Postgres データベースに対する SQL クエリに出くわしました。すなわち:
select distinct(pattern) as pattern, style, ... etc ...
from styleview
where ... etc ...
DISTINCT は関数ではありません! また、そのクエリ例の括弧は無視されます。
オプションの[ ON (expression) ] を使用すると、実際に結果が変わります。
テスト 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 |
テスト 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 (expression) ]機能は、「最初」、「最後」、「最も早い」、または「最新」の行を個別のリストに提供できるため、非常に便利です。ただし、この機能は ORDER BY 句と組み合わされていることに注意してください。実際、order by 句 ALSO が SELECT DISTINCT ON PostgreSQL で使用される式を参照しない限り、エラーが発生します。
エラー: SELECT DISTINCT ON 式は最初の ORDER BY 式と一致する必要があります
上記の例は、こちらの sqlfiddle で動作しているのを見ることができます
答えを複雑にしすぎたくはありませんが、言及する価値のあるしわがあります。
select distinct (foo,fub) from bar;
今、括弧は何かをしますが、それらがすることは明確に直接関係しません。「複合型」を参照