[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 メーリングリストの案内