gpt4 book ai didi

SQL - 使用一个查询的结果作为一个语句中其他两个查询的基础

转载 作者:行者123 更新时间:2023-12-01 13:29:42 24 4
gpt4 key购买 nike

我正在进行概率计算。我有一个查询来计算事件发生的总次数。从这些事件中,我想获得子事件发生的次数。获取总事件的查询有 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@ 确实粘贴了两次,查询看起来非常难看。

最佳答案

如果您的 sql 支持子查询分解,则可以选择使用 WITH 语句重写它。它允许多次使用子查询。 With 会将它们创建为 Oracle 中的内联 View 或临时表。

这是一个人为的例子。

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

关于SQL - 使用一个查询的结果作为一个语句中其他两个查询的基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/444673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com