我有一个查询:
Select
ItemCount,
(Select Sum(ItemCount) Where <5-item conditional>) as ItemTotal,
JobSize,
(Select Sum(JobSize) Where <SAME 5-item conditional>) as JobTotal
...
重复测试棒。有没有办法解决这个问题?
答案 0 :(得分:3)
您可以使用WITH语句。 例如:
WITH template_name AS (
SELECT ItemCount, JobSize...
FROM <your_table>
WHERE <5-item conditional>
)
然后您的查询可以转换为:
Select
ItemCount,
(Select Sum(ItemCount) FROM template_name) as ItemTotal,
JobSize,
(Select Sum(JobSize) FROM template_name) as JobTotal
答案 1 :(得分:0)
假设所有每个项目的子查询都使用相同的WHERE
谓词,您可以在同一个查询中执行它们,并将一个结果行连接回基表:
SELECT
base.ItemCount,
agg.ItemTotal,
base.JobSize,
agg.JobTotal
FROM
base
CROSS JOIN (
SELECT
Sum(ItemCount) AS ItemTotal,
Sum(JobSize) AS JobTotal
FROM base
WHERE <5-item conditional>
) agg
它只给你一个子查询而不是两个(或更多),这甚至比仅预过滤行更好。如果您还想将相同的条件同时应用于(原始)外部查询,那么您可以将其与其他答案中描述的WITH
方法相结合,以便对所有人进行一次过滤。
更新:以下是将联合聚合查询与通过WITH
子句生成的临时表进行组合的示例:
WITH target_rows AS (
SELECT ItemCount, JobSize...
FROM base
WHERE <5-item conditional>
)
SELECT
target_rows.ItemCount,
agg.ItemTotal,
target_rows.JobSize,
agg.JobTotal
FROM
target_rows
CROSS JOIN (
SELECT
Sum(ItemCount) AS ItemTotal,
Sum(JobSize) AS JobTotal
FROM target_rows
) agg
<optional additional filter predicate>
正如我最初写的那样,这总体上应用了<5-item conditional>
过滤器,因此如果结果行应该按照与聚合查询(-ies)相同的条件进行过滤,则效率最高。您可以向外部查询添加WHERE
子句以进一步过滤结果。
或者,您可以调整它以在WITH
子句中应用不同的过滤器,并仍然在子查询中应用<5-item-conditional>
。这是将子查询所考虑的行限制为外部查询所考虑的行的合理方法。