当前位置:  开发笔记 > 数据库 > 正文

SQL - 在一个语句中使用查询结果作为另外两个查询的基础

如何解决《SQL-在一个语句中使用查询结果作为另外两个查询的基础》经验,为你挑选了1个好方法。

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

我想对此查询执行两项操作:计算其中的行数,并计算此查询的查询结果中的行数.现在,我能想到的唯一方法就是这样做(用复杂的查询替换@ total @来获取所有行,而@ conditions @用不太复杂的条件替换来自@ total @的行必须匹配子事件):

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

如你所知,@ total @重复两次.有没有办法解决?有没有更好的方法来做我想做的事情?

重新强调:@condition @取决于@otal @返回的内容(它确实如此t1.foo = bar).

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



1> EvilTeach..:

如果你的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

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有