[pgsql-jp: 29127] DISTINCT付きSELECT句に現れないコラムでソート

MORIMOTO, Yoshinori ymo @ fabrice.co.jp
2003年 2月 19日 (水) 04:14:54 JST


こんばんわ。守本と申します。

MySQLで開発しているヨーロッパのプログラマーの書いたプログラムを
PostgreSQLに移植していて起きたのですが。

[テストスクリプト]
create table t1 (c1 char(1),c2 char(1));
insert into t1 values('1','z');
insert into t1 values('1','y');
insert into t1 values('2','x');
select c1 from t1 order by c2;
select distinct c1 from t1 order by c2;
drop table t1;

[実行結果抜粋]
test=# select c1 from t1 order by c2;
 c1
----
 2
 1
 1
(3 rows)

test=# select distinct c1 from t1 order by c2;
ERROR:  For SELECT DISTINCT, ORDER BY expressions must appear in target list


7.2.xマニュアルより
>SELECT の結果リストに現れないフィールドを含む任意の式(SQL92 の拡張)を 
>ORDER BY することも可能です。したがって下記の文は正当です。
>SELECT name FROM distributors ORDER BY code;

ということなので最初のselect文が実行できるのは当然。
2番目のdistinct付きのselect文が実行できないようです。
PostgreSQL 7.2.2と7.3.2で確認しました。
Oracle9iでもPostgreSQLと同様でしたが、MySQLでは意図したとおりにselectで
きました。

まあ、私はエラーメッセージの通りということで納得はしていて対処も済んでい
るのですが、これはSQL92の仕様とかそういったものなのでしょうか?

マニュアルからはdistinctの件についてはちょっと読み取れませんでしたが、以
下の部分が関連するのかな。
7.2.xマニュアルより
> もし ORDER BY アイテムが結果の列名と入力列名の両方に当てはまる単純な名前だった場合、
>ORDER BY はそれを結果列名として解釈します。これは GROUP BY が同じ状況で
>行なう選択とは逆です。この不一致は標準 SQL92 からくるものです。

私は、直感的にはどっちもできないと考えていたので、今回の件に当たるまでは
最初のselectができることを知りませんでした。

-- 
MORIMOTO, Yoshinori <ymo @ fabrice.co.jp>





pgsql-jp メーリングリストの案内