[pgsql-jp: 39463] Re: 0 件でも表示

jun kuwamura kuwamura.jun @ gmail.com
2008年 6月 23日 (月) 13:11:55 JST


くわむらです

いろいろと勉強になります。

postgresql 8.3で試すとエラーになり、ヒントが出ました。
--
ERROR:  subquery in FROM must have an alias
HINT:  For example, FROM (SELECT ...) [AS] foo.
--

SELECT code, name, COALESCE(cnt, 0)
 FROM category
 LEFT OUTER JOIN (SELECT code, count(*) AS cnt FROM article GROUP BY code
                 ) AS foo USING(code) ORDER BY 1;

ヒントの通り、"AS foo" を加えました。

どちらがわかり易いかということですが、COALESCEは
私にはどうも良く分かりません。欠落が2つ以上のときも
対応する値をうまく補えるのでしょうか?

むしろ、LEFT OUTER JOIN の機能を知ったほうが
分かり易いような気がします。GROUP BYをはずして、
単純にそれぞれの結合の違いを比べてみると。

(1) 普通の結合
SELECT
   category.code
 , name
 , article.code
FROM category, article
WHERE  category.code = article.code;
--
 code | name  | code
------+-------+------
    1 | cat-1 |    1
    2 | cat-2 |    2
    4 | cat-4 |    4
(3 行)
--

(2)左への外部結合
SELECT
   category.code
 , name
 , article.code
FROM category LEFT OUTER JOIN article
ON  category.code = article.code;
--
 code | name  | code
------+-------+------
    1 | cat-1 |    1
    2 | cat-2 |    2
    3 | cat-3 |
    4 | cat-4 |    4
(4 行)
--

LEFT OUTER JOIN の場合は、左側に指定されて
いた category の行を残して結合していることが
わかると思います。


2008/6/21 ゆむ <qqqz9b69 @ green.ocn.ne.jp>:
>
> 私としては↓の方が初心者にはイメージが付きやすように思いますが如何でしょう。
>
> SELECT code, name, COALESCE(cnt, 0)
>  FROM category
>  LEFT OUTER JOIN (SELECT code, count(*) AS cnt FROM article GROUP BY code
>                  ) USING(code)
>  ORDER BY 1;
>
>
> 結合してからの集計方法が分からなければ、
> 集計してから結合すれば良い。
>
> --
> ゆむ
>
> ↓↓↓↓↓↓↓↓↓ Original Message ↓↓↓↓↓↓↓↓↓
> From:    HOTTA Michihide <hotta @ net-newbie.com>
> To:      PostgreSQL Japanese Mailing List <pgsql-jp @ ml.postgresql.jp>
> Date:    Sat, 21 Jun 2008 13:57:29 +0900
> Subject: [pgsql-jp: 39457] Re: 0 件でも表示
> - - - - - - - - - - - - - - - - - - - -
>> 堀田@長崎市です。
>>
>> From: s-koga @ pi.jp.nec.com
>> To: PostgreSQL Japanese Mailing List <pgsql-jp @ ml.postgresql.jp>
>> Date: Thu, 19 Jun 2008 23:12:18 +0900
>> Subject: [pgsql-jp: 39443] Re: 0 件でも表示
>>
>> > いつもお世話になっております。
>> > 古賀@教育ビジネス部.NECソフトウェア九州です。
>>
>> 御社のLinux講習テキストには、公私共々お世話になっております m(__)m
>>
>> > ↓これでいかがでしょう?
>> >
>> > SELECT DISTINCT
>> >     category.code
>> >   , name
>> >   , count(*)
>> > FROM  category LEFT OUTER JOIN article
>> > ON  category.code = article.code
>> > GROUP BY    category.code, category.name;
>>
>> これだと、以下のようになりました。記事のない cat-3 についての件数
>> も1としてカウントされてしまうようです。
>>
>>  code | name  | count
>> ------+-------+-------
>>     1 | cat-1 |     2
>>     2 | cat-2 |     2
>>     3 | cat-3 |     1
>>     4 | cat-4 |     1
>> (4 行)
>>
>> From: s-koga @ pi.jp.nec.com
>> To: PostgreSQL Japanese Mailing List <pgsql-jp @ ml.postgresql.jp>
>> Date: Thu, 19 Jun 2008 23:36:12 +0900
>> Subject: [pgsql-jp: 39444] Re: 0 件でも表示
>>
>> > SELECT
>> >     category.code
>> >   , name
>> >   , count(article.code)
>> > FROM  category LEFT OUTER JOIN article
>> > ON    category.code = article.code
>> > GROUP BY category.code, category.name
>> > ORDER BY 1
>>
>> これでうまくいきました。ありがとうございます。
>> count(article.code) なんてのを思いつくようになるには、相当経験を
>> 積まないといけないみたいです。。。
>>
>> >>SELECT DISTINCT
>> >>    category.code
>> >>  , name
>> >>  , count(*)
>> >>FROM   category,article
>> >>WHERE  category.code = article.code
>> >>GROUP BY    category.code, category.name;
>> >>
>> >> code | name  | count
>> >>------+-------+-------
>> >>    1 | cat-1 |     2
>> >>    2 | cat-2 |     2
>> >>    4 | cat-4 |     1
>> >>(3 行)
>> >>
>> >>こうすると、記事のない cat-3 については出力されません。
>> >>
>> >> code | name  | count
>> >>------+-------+-------
>> >>    1 | cat-1 |     2
>> >>    2 | cat-2 |     2
>> >>    3 | cat-3 |     0
>> >>    4 | cat-4 |     1
>> >>(4 行)
>> >>
>> >>後者のように出力したいのですが、どうすればよいでしょうか?
>> >>JOIN を使うんじゃないかなーとは思ってるんですが…。
>>
>> --
>> HOTTA Michihide <hotta @ net-newbie.com>
> ↑↑↑↑↑↑↑↑ Original Message Ends↑↑↑↑↑↑↑↑
>
>



-- 
 Jun Kuwamura
rC Cn
 ^
 ~



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