【发布时间】: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