13

「distinct」という名前の関数を使用する、特に Postgres データベースに対する SQL クエリに出くわしました。すなわち:

select distinct(pattern) as pattern, style, ... etc ...
from styleview
where ... etc ...

これは、SELECT の通常の DISTINCT 修飾子ではないことに注意してください。少なくとも、DISTINCT 修飾子の通常の構文ではありません。括弧に注意してください。どうやら DISTINCT を関数として使用しているか、これは特別な構文である可能性があります。

これが何を意味するか分かりますか?

ちょっといじってみたけど書いてみたら

select distinct(foo)
from bar

私は同じ結果を得る

select distinct foo
from bar

それを同じ選択内の他のフィールドと組み合わせると、それが何をしているのか正確にはわかりません。

Postgres のドキュメントには何も見つかりません。

助けてくれてありがとう!

4

4 に答える 4

3

ドキュメントから:

DISTINCTを指定すると、すべての重複行が結果セットから削除されます (重複の各グループから 1 行が保持されます) 。ALL は逆を指定します。すべての行が保持されます。それがデフォルトです。

DISTINCT ON ( expression [, ...] ) は、指定された式が等しいと評価される行の各セットの最初の行のみを保持します。DISTINCT ON 式は、ORDER BY と同じ規則を使用して解釈されます (上記を参照)。ORDER BY を使用して目的の行が最初に表示されるようにしない限り、各セットの「最初の行」は予測できないことに注意してください。例えば、

このON部分はオプションなので、実際には次のようになります。

  1. 使用しているブラケット
  2. DISTINCTクエリ内の配置 - SELECT 句の最初の位置以外で使用すると、SQL Server と MySQL はエラーをスローします

私の知る限り、PostgreSQL はこの構文をサポートする唯一のデータベースです。

于 2010-08-04T17:31:36.413 に答える
1

タイプミスか、誰かが書いたものを誤解したかのどちらかです。

詳細はわかりませんが、括弧を優先順位演算子として使用できます (数学と同じように)。しかし、実際には意味を変えずに、多くのものを括弧で囲むことができるようになると思います。

たとえば、次の 2 つのクエリはまったく同じものを返します。

select foo
from bar

select (foo)
from bar

括弧を使用して列をレコードにグループ化することもできるため、紛らわしいです。次に例を示します。

select (foo, baz)
from bar

したがって、元のクエリでは、彼らが実際に書いたものは次のようになります。

select distinct *
from
(
    select pattern as pattern, style, ... etc ...
    from styleview
    where ... etc ...
)

これは、彼らが意図したものである場合とそうでない場合があります。推測する必要がある場合、他の回答のいくつかで言及されている「DISTINCT ON(...)」構文を使用していると推測します。

于 2015-10-08T13:44:50.080 に答える
0

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;

今、括弧は何かをしますが、それらがすることは明確に直接関係しません。「複合型」を参照

于 2016-02-14T03:45:55.977 に答える