- - PR -
select countについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-02-22 16:13
現在、下記の命令でデータを取得しているのですが、WHERE句に
同じ条件が入っていてもっとスマートにならないかと思っています。 それで、自分なりに調べたのですが分かりません。 どなたか良いアドバイスを頂けませんでしょうか。 環境:postgre8.0.1 SELECT (SELECT count(*) FROM TEST1 WHERE cd = '1' AND id = '1'), name FROM TEST1 WHERE cd = '1' AND id = '1' 結果: --------------------- count(*) | name | --------------------- 3 | test4 | --------------------- | ||||
|
投稿日時: 2007-02-22 17:04
集計関数+GROUP BYで個別集計になります。
SELECT COUNT(*),NAME FROM TEST1 WHERE cd = '1' AND id = '1' GROUP BY NAME で、どうでしょ? | ||||
|
投稿日時: 2007-02-22 18:00
でっち6号さん、返答ありがとうございます。
自分もでっち6号さんのように試してみましたが、 name毎で集計されてしまいますので この方法を諦めました。 やっている事としましてはcd=1,name=1に当てはまるものをカウントをして、 そのカウントされた数と同じ条件でname列をくっつけているというような感じなります。 | ||||
|
投稿日時: 2007-02-22 18:12
もしかして、最初にまつじんが記述した結果ではなく、 --------------------- count(*) | name | --------------------- 3 | test4 | 3 | test4 | 3 | test4 | --------------------- としたいと言っていますか? #日本語が変だったので修正 [ メッセージ編集済み 編集者: KOX 編集日時 2007-02-22 18:13 ] | ||||
|
投稿日時: 2007-02-22 18:33
KOXさん返答ありがとうございます。
たぶん、KOXさんが言われている内容だと思います。 分かりづらくて申し訳ありません。 実際は、nameには同じ名前が無いので ---------------- count| name | ---------------- 3 | test1| 3 | test2| 3 | test3| ---------------- というような感じになります。 ちなみにcountに関しては同じ数字になります。 それと、若干記述が間違っていましたので訂正します。 SELECT (SELECT count(*) FROM TEST1 WHERE cd = '1' AND id = '1')AS count, name FROM TEST1 WHERE cd = '1' AND id = '1' [ メッセージ編集済み 編集者: まつじん 編集日時 2007-02-22 18:36 ] | ||||
|
投稿日時: 2007-02-22 19:23
count側の条件を結合に変更するかcdとidで集計したものとjoinすれば、
条件を設定する箇所は1つにできますが、処理コストはいずれの場合も 元のSQLより高くなると思います。 ちなみに前者の例です(Oracle10Gで動作確認)
countは必ずレコード数になりますよね? 結果を利用する側のプログラムで何とかしてしまう方が 「スマート」だと思いますが... [ メッセージ編集済み 編集者: でっち6号 編集日時 2007-02-22 19:39 ] | ||||
|
投稿日時: 2007-02-23 11:19
でっち6号さんの方法でもよいですし、
FROM句で カウントするselectのもありです。 select count, name from test1,(select count(*) as count xxxxx ) where xxxx とか。 ただスマートとかどうかは別として、 同一条件なのであれば、 test1.cd = wk.cd とするよりも、 初めの投稿のようにしたほうが、 条件が一目瞭然で可読性があると思います。 | ||||
|
投稿日時: 2007-02-23 12:03
selectの選択式の中にselect count(*)を書くと、今回の場合は3回、select count(*)が
実行されます。fromにインラインビューとして書き、直積にする方が性能的には良い でしょう。 2箇所に同じ条件式を書くのは、1行しか検索されないものと、複数行検索されるものを 繋げるのだから仕方ないし、その方が可読性も良いと思います。
|