【问题标题】:Alternative SQL queries替代 SQL 查询
【发布时间】:2022-08-14 18:45:35
【问题描述】:

我需要三个替代查询返回与以下查询相同的答案。

SELECT building, SUM(budget) AS totalbudget
FROM department 
GROUP BY building
HAVING SUM(budget) > 10000;

创建三种替代方法以获得相同的确切结果,消除HAVING 子句。并为每个替代解释查询对性能的影响?

第一种方式:

SELECT building, totalbudget
FROM 
    (SELECT building, SUM(budget) AS totalbudget
     FROM department 
     GROUP BY building)
WHERE totalbudget > 10000;

还有另外两种方法...

  • 您使用的是哪个 dbms? (不同的产品有不同的优化技巧。)
  • 我的意思是,我在没有子句的情况下要求对该查​​询进行不同的查询。我使用甲骨文
  • 是的,但你也写了\"对于每个备选方案,解释查询对性能的影响\"。
  • 问?你的意思是说这不是作业或面试问题吗?
  • 其实这是一道考试题。这是不允许的吗???。但这是个好问题。

标签: sql oracle group-by having


【解决方案1】:

选项1:

SELECT *
FROM   department
MATCH_RECOGNIZE(
  PARTITION BY building
  MEASURES
    SUM(budget) AS totalBudget
  PATTERN (^ all_rows+ $)
  DEFINE
    all_rows AS 1 = 1
)
WHERE totalBudget > 10000

选项 2:

SELECT building,
       SUM(budget) AS totalbudget
FROM   department d
WHERE  10000 < (
  SELECT SUM(budget)
  FROM   department t
  WHERE  d.building = t.building
)
GROUP BY building

选项 3:

SELECT building,
       SUM(budget) AS totalbudget
FROM   department
GROUP BY building
ORDER BY totalbudget DESC
FETCH FIRST ( SELECT COUNT(*)
              FROM   (
                SELECT SUM(budget) AS total
                FROM   department
                GROUP BY building
              )
              WHERE total > 10000            ) ROWS ONLY;

并为每个替代解释查询对性能的影响?

它们的性能都会比使用HAVING 更差。

db<>小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2015-08-23
    • 1970-01-01
    • 2018-06-08
    • 2012-06-18
    • 2011-09-18
    相关资源
    最近更新 更多