【问题标题】:SQL: Optimize query with multiple CASE statementsSQL:使用多个 CASE 语句优化查询
【发布时间】:2021-06-02 01:29:17
【问题描述】:

由于行数的原因,我有一个包含许多 CASE 语句的查询,这些语句运行了很长时间。在我的研究中,我还没有找到解决方案。有没有办法更有效地编写 CASE 语句并获得更好的性能?

数据库:甲骨文

table_a

表_y
都是我从中选择的同一张表。

示例数据

contract_number product_description product damagenumber date internalname payment
1 Product T-Shirt product_name 111 20210101 Web 30.20
2 Product T-Shirt product_name 222 20210202 Web 19.38
3 Product Hoodie product_name2 333 20210215 Store 20.49
3 Product Hoodie product_name2 334 20210302 Store 15.99
5 Product Hoodie product_name2 123 20210120 Telephone 99.99
SELECT
    contract_number,
    product_description,
    product,
    CASE
        WHEN ( x.produkt = 'product_name'
               AND (
            SELECT
                COUNT(DISTINCT damagenumber)
            FROM
                table z
            WHERE
                date BETWEEN add_months(trunc(sysdate), - 6) AND sysdate
                AND internalname <> 'CONDITION'
                AND x.contract_number = z.contract_number
            GROUP BY
                z.contract_number 
        ) = 1
               AND (
            SELECT
                SUM(y.payment)
            FROM
                table_y y
            WHERE
                date BETWEEN add_months(trunc(sysdate), - 6) AND sysdate
                AND internalname <> 'CONDITION'
                AND x.contract_number = y.contract_number
        ) > 1500 ) THEN
            (
                SELECT
                    COUNT(DISTINCT damagenumber)
            FROM
                table z
            WHERE
                date BETWEEN add_months(trunc(sysdate), - 6) AND sysdate
                AND internalname <> 'CONDITION'
                AND x.contract_number = z.contract_number
            GROUP BY
                z.contract_number 
            )
            ELSE
            0
            END) AS count_numbers,
FROM
    table_a x
GROUP BY
    x.contract_number,
    x.product_description,
    x.product;

以上是一个简化的例子。我的查询中有很多 WHEN 条件。

提前致谢

【问题讨论】:

  • 我删除了不一致的数据库标签。请标记您真正使用的数据库。这在有关性能的问题中尤为重要。目前还不清楚这个问题涉及多少张表。样本数据、期望的结果以及对预期逻辑的清晰解释都会有所帮助。
  • 请共享表结构和插入语句以填充示例数据。
  • 我认为问题的根本原因不在 case/when 语句中。您是否在表(table 和 table_y)上创建了索引?也许这些是大表,子查询运行很长时间。

标签: sql


【解决方案1】:

也许这有帮助

with tabletemp as (
    SELECT z.contract_number
    , COUNT(DISTINCT damagenumber) damagenumber_count
    FROM table z
    WHERE date BETWEEN add_months(trunc(sysdate), - 6) AND sysdate AND internalname <> 'CONDITION'
    GROUP BY z.contract_number 
), tabletemp2 as (
    SELECT y.contract_number
    , SUM(y.payment) payment_sum
    FROM table_y y
    WHERE date BETWEEN add_months(trunc(sysdate), - 6) AND sysdate AND internalname <> 'CONDITION'
    group by y.contract_number
)

SELECT
    contract_number,
    product_description,
    product,
    CASE WHEN ( x.produkt = 'product_name' AND tt.damagenumber_count = 1 AND tt2.payment_sum > 1500 ) THEN
            tt.damagenumber_count
            ELSE
            0
            END AS count_numbers,
FROM
    table_a x
    join tabletemp tt on (tt.contract_number = x.contract_number)
    join tabletemp2 tt2 on (tt2.contract_number = x.contract_number)

也许这个查询有一些错误(我无法测试)但你应该尝试这种方式

【讨论】:

    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 2011-05-30
    • 2012-05-10
    • 2022-06-21
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2014-09-21
    相关资源
    最近更新 更多