gpt4 book ai didi

django - 如何避免 SQL 中的 CTE 或子查询?

转载 作者:行者123 更新时间:2023-11-29 12:19:48 27 4
gpt4 key购买 nike

问题

假设我们有 1 作为 foo,我们希望 foo+1 在 SQL 中作为 bar。

使用 CTE 或子查询,例如:-

select foo+1 as bar from (select 1 as foo) as abc;

我们会得到(在我正在使用的 postgre 中):-

 bar 
-----
2

但是,当我尝试以下操作时:-

select 1 as foo, foo+1 as bar;

出现以下错误:-

ERROR:  column "foo" does not exist
LINE 1: select 1 as foo, foo+1 as bar;
^

有没有不使用 CTE 或子查询的解决方法?

我为什么要问?

我将 Django 用于 Web 服务,以便对数据库中的对象进行排序和分页,我必须获取赞成票和反对票的计数,并对这两个值进行一些额外的数学运算(即计算威尔逊得分区间),其中这两个值被多次使用。

我现在所知道的就是 extra() 函数不会破坏 ORM(?) [例如惰性查询集和 prefetch_related()功能]。

因此,我需要一种方法来从某个地方调用这两个值,而不是在计算分数时多次执行 SELECT。 (或者事实并非如此?)

附言。目前我将投票计数存储为数据库字段并更新它们,但我已经有一个投票模型,因此更新投票计数并将投票插入数据库似乎多余且缓慢

最佳答案

不,您需要子查询或 CTE 来执行此操作。不过还有一个替代方案:创建一个存储过程。

CREATE FUNCTION wilson(upvote integer, downvote integer) RETURNS float8 AS $$
DECLARE
score float8;
BEGIN
-- Calculate the score
RETURN score;
END; $$ LANGUAGE plpgsql STRICT;

在您的 ORM 中,您现在将函数作为 SELECT 语句的一部分进行调用:

SELECT id, upvotes, downvotes, wilson(upvotes, downvotes) FROM mytable;

也使代码更简洁。

关于django - 如何避免 SQL 中的 CTE 或子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32604539/

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