2

我正在做一个概率计算。我有一个查询来计算事件发生的总次数。从这些事件中,我想获得子事件发生的次数。获取总事件的查询有 25 行长,我不想只是复制 + 粘贴两次。

我想对这个查询做两件事:计算其中的行数,并计算这个查询的查询结果中的行数。现在,我能想到的唯一方法是(用复杂的查询替换 @total@ 以获取所有行,并将 @conditions@ 替换为来自@total@ 的行必须匹配的不太复杂的条件子事件):

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

如您所见,@total@ 重复了两次。有没有办法解决?有没有更好的方法来做我想做的事情?

再次强调:@conditions@ 确实取决于@total@ 返回的内容(它会执行类似的操作t1.foo = bar)。

最后一点:@total@ 本身需要大约 250 毫秒。这个更复杂的查询需要大约 300 毫秒,因此 postgres 本身可能会进行一些优化。尽管如此,查询看起来非常难看,@total@ 字面上粘贴了两次。

4

4 回答 4

9

如果您的 sql 支持子查询分解,则可以使用 WITH 语句重写它。它允许子查询多次使用。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

将重复使用的子查询放入临时表中,然后从临时表中选择您需要的内容。

于 2009-01-14T21:12:32.700 回答
0

@EvilTeach:

我还没有看到“with”(可能没有在 Sybase 中实现 :-()。我喜欢它:在一块中完成您需要的操作,然后消失,甚至比临时表更少杂乱无章。酷。

于 2009-01-15T01:55:42.317 回答