- 締切済み
入れ子を使わずにレコードの総計を出したい
こんにちわ。PostgreSQLのSQL文について質問させてください。 以下のSQL文を実行したとき、 # select c.id from C c left join S s on (s.id=c.id) where c.num = 1 group by c.id having count(s.id) >= 5; id ---- 7 5 (2 rows) というデータが表示されるんですが、このSQL文で抽出したデータの総件数を求めるにはどうしたらいいでしょうか? 入れ子を使うと、 # select count(*) from (select c.id from C c left join S s on (s.id=c.id) where c.num = 1 group by c.id having count(s.id) >= 5) tmp; というふうに書け、 count ------- 2 (1 row) と表示されるのはわかりますが、入れ子を使わずに上のように表示させるにはどうしたらよいでしょうか? よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
入れ子を使いたくないというのは、どういう理由からでしょうか? 適切なインデクスを定義しておけば、性能が大幅に劣化はしないと思いますけど? group byでrollupの指定ができれば可能かと思いましたが、PostgreSQL 8.3でも未実装のようです。
- chukenkenkou
- ベストアンサー率43% (833/1926)
>上記のようにおっしゃるようにselect count(c.id)~をすると、答えは、4であるはず >どうも一つ一つのidのcountをしているみたいです。(詳しくはわかりませんが)なぜこうなるのかがわかりません。 group byを指定しているのですよね? そうであれば、グループ毎にcountされて当然です。そういう指定ですから。 >あと、いろいろ検証してみたのですが、どうもhavingが原因のようです。 >havingがなければ正常に動きますが、havingを使わなければいけない時うまくいきません。 本末転倒では? 何が正常なのですか? 得たい結果があり、それを得るためにhavingで条件を指定しているのですよね?
補足
回答ありがとうございます。 ちょっと私の言い方で誤解を与えました。申し訳ございません。 >group byを指定しているのですよね? >そうであれば、グループ毎にcountされて当然です。そういう指定ですから。 そうです、group byでc.idを指定してます。求めたいものはgroup byでidを指定し、それを基準にして抽出したidの総件数を求めたいのですが、できません。この場合どうすれば希望通りの答えが出ますか? >>あと、いろいろ検証してみたのですが、どうもhavingが原因のようです。 >>havingがなければ正常に動きますが、havingを使わなければいけない時うまくいきません。 >本末転倒では? >何が正常なのですか? >得たい結果があり、それを得るためにhavingで条件を指定しているのですよね? 書き方が悪かったです。havingを使わなければ求めたいものは抽出できませんが、havingをなくしたSQL文はそのSQL文の予想通りの答えが出るという意味です。でもそれは私がほしい答えではありません。 紛らわしい書き方をして申し訳ございません。 よろしくお願いいたします。
- alte_6
- ベストアンサー率60% (9/15)
「select c.id~」を 「select count(c.id)~」に置き変えたら出ないのかな?
補足
こんにちわ。回答ありがとうございます。 はじめ私もそうしたら出ると思ったんですが、わけのわからない数字が出ます。たとえば、上のように c.idを求めると、 id ------------ 356187925 489456522 486512566 248965255 (4 rows) になるのですが、上記のようにおっしゃるようにselect count(c.id)~をすると、答えは、4であるはずが、 count ------- 4 4 8 5 (4 rows) というようになります。 どうも一つ一つのidのcountをしているみたいです。(詳しくはわかりませんが)なぜこうなるのかがわかりません。 あと、いろいろ検証してみたのですが、どうもhavingが原因のようです。 havingがなければ正常に動きますが、havingを使わなければいけない時うまくいきません。 これはpostgreSQLのバグなのか仕様なのか、またはほかにいいやり方があれば教えていただきたいです。
補足
回答が遅れてすいませんでした。 まず、入れ子を使いたくない理由は、 PerlのCpanモジュールであるDBIx::CLASSを使用し、 データベースにアクセスし、大量のデータを扱いたいので、入れ子を使いたくありません。