2

確率計算をしています。イベントが発生した合計回数を計算するクエリがあります。これらのイベントから、サブイベントの発生回数を取得したいと考えています。合計イベントを取得するためのクエリは 25 行の長さであり、コピーして 2 回貼り付けることはしたくありません。

このクエリに対して 2 つのことを行いたいと思います。行数を計算することと、このクエリのクエリ結果の行数を計算することです。今のところ、私が考えられる唯一の方法はこれです (@total@ をすべての行を取得するための複雑なクエリに置き換え、@condition@ ​​を @total@ からの行が一致しなければならない複雑でない条件に置き換えます)。サブイベント):

SELECT (SELECT COUNT(*) FROM (@total@) AS t1 WHERE @conditions@) AS suboccurs, 
       COUNT(*) AS totaloccurs FROM (@total@) as t2

お気づきのとおり、@total@ が 2 回繰り返されています。これを回避する方法はありますか?私がやろうとしていることを行うためのより良い方法はありますか?

もう一度強調します: @condition@ ​​は @total@ が返すものに依存します (それは のようなことをしますt1.foo = bar)。

いくつかの最終的なメモ: @total@ だけで ~250ms かかります。このより複雑なクエリには約 300 ミリ秒かかるため、postgres 自体が何らかの最適化を行っている可能性があります。それでも、@total@ が文字どおり 2 回貼り付けられているため、クエリはひどく見苦しく見えます。

4

4 に答える 4

9

SQL がサブクエリ ファクタリングをサポートしている場合は、WITH ステートメントを使用してそれを書き換えることができます。サブクエリを複数回使用できるようにします。を使用すると、インライン ビューまたは Oracle の一時テーブルとして作成されます。

これは不自然な例です。

WITH
x AS
(
    SELECT this
    FROM THERE
    WHERE something is true
),
y AS
(
    SELECT this-other-thing
    FROM somewhereelse
    WHERE something else is true
), 
z AS
(
    select count(*) k
    FROM X
)
SELECT z.k, y.*, x.*
FROM x,y, z
WHERE X.abc = Y.abc
于 2009-01-14T21:22:57.047 に答える
1
SELECT COUNT(*) as totaloccurs, COUNT(@conditions@) as suboccurs
FROM (@total@ as t1)
于 2009-01-14T21:11:29.020 に答える
0

@EvilTeach:

私は「with」を見たことがありません(おそらくSybaseでは実装されていません:-()。私はそれが好きです:必要なことを1つのチャンクで実行し、一時テーブルよりもさらに簡単になくなります。

于 2009-01-15T01:55:42.317 に答える
0

再利用されたサブクエリを一時テーブルに入れ、一時テーブルから必要なものを選択します。

于 2009-01-14T21:12:32.700 に答える