如何消除重复的嵌套SQL查询?

时间:2015-02-27 22:30:52

标签: sql

我有一个查询:

Select 
    ItemCount, 
    (Select Sum(ItemCount) Where <5-item conditional>) as ItemTotal,
    JobSize,
    (Select Sum(JobSize) Where <SAME 5-item conditional>) as JobTotal
...

重复测试棒。有没有办法解决这个问题?

2 个答案:

答案 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>。这是将子查询所考虑的行限制为外部查询所考虑的行的合理方法。