gpt4 book ai didi

sql - 在sqlite中将子查询转换为左联接

转载 作者:行者123 更新时间:2023-12-03 19:41:43 25 4
gpt4 key购买 nike

我有一个针对使用几个子查询的SQLite数据库运行的查询。为了适应一些新要求,我需要将其转换为使用联接。以下是原始查询的结构版本:

SELECT c.id AS category_id, b.budget_year,
(
SELECT sum(actual)
FROM lines l1
WHERE status = 'complete'
AND category_id = c.id
AND billing_year = b.budget_year
) AS actual
(
SELECT sum(planned)
FROM lines l2
WHERE status IN ('forecasted', 'in-progress')
AND category_id = c.id
AND billing_year = b.budget_year
) AS rough_proposed
FROM categories AS c
LEFT OUTER JOIN budgets AS b ON (c.id = b.category_id)
GROUP BY c.id, b.budget_year;


下一个查询是我第一次尝试将其转换为使用 LEFT OUTER JOIN的方法:

SELECT c.id AS category_id, b.budget_year, sum(l1.actual) AS actual, sum(l2.planned) AS planned
FROM categories AS c
LEFT OUTER JOIN budgets AS b ON (c.id = b.category_id)
LEFT OUTER JOIN lines AS l1 ON (l1.category_id = c.id
AND l1.billing_year = b.budget_year
AND l1.status = 'complete')
LEFT OUTER JOIN lines AS l2 ON (l2.category_id = c.id
AND l2.billing_year = b.budget_year
AND l2.status IN ('forecasted', 'in-progress'))
GROUP BY c.id, b.budget_year;


但是, actualrough_proposed列比预期的要大得多。我不是SQL专家,而且我很难理解这里发生的情况。是否有直接方法将子查询转换为联接?

最佳答案

您的两个查询都存在问题。但是,第一个查询隐藏了问题,而第二个查询使其可见。

这是怎么回事:您两次加入lines-一次以l1身份加入,再一次以l2身份加入。当同时存在实际行和预测行/进行中行时,分组之前的查询将多次具有同一行。发生这种情况时,每行将被计数多次,从而导致值膨胀。

第一个查询将其隐藏,因为它不会将聚合应用于actualrough_proposed列。 SQLite为每个组选择第一个条目,该条目具有正确的值。

您可以通过仅连接到行一次并有条件地计算数量来修复查询,如下所示:

SELECT
c.id AS category_id
, b.budget_year
, SUM(CASE WHEN l.status = 'complete' THEN l.actual END) AS actual
, SUM(CASE WHEN l.status IN ('forecasted', 'in-progress') THEN l.planned END) AS planned
FROM categories AS c
LEFT OUTER JOIN budgets AS b ON (c.id = b.category_id)
LEFT OUTER JOIN lines AS l ON (l.category_id = c.id AND l1.billing_year = b.budget_year)
GROUP BY c.id, b.budget_year


在这个新查询中,来自 lines的每一行仅被引入一次;将其计入 actual / planned列之一的决定是在 SUM聚合函数中嵌入的条件表达式内进行的。

关于sql - 在sqlite中将子查询转换为左联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27948433/

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