我有两个表文件和错误:
还有
我想创建一个结果集,其中包含虚拟编码变量,如下所示:
我可以让它在CASE语句和EXISTS语句中工作,如下所示:
SELECT f.detail_id,
(CASE WHEN EXISTS
(SELECT * FROM errors e WHERE f.detail_id = e.detail_id AND e.error_code = 400)
THEN 1 ELSE 0 END) AS error_400,
(CASE WHEN EXISTS
(SELECT * FROM errors e WHERE f.detail_id = e.detail_id AND e.error_code = 405)
THEN 1 ELSE 0 END) AS error_405,
(CASE WHEN EXISTS
(SELECT * FROM errors e WHERE f.detail_id = e.detail_id AND e.error_code = 410)
THEN 1 ELSE 0 END) AS error_410,
(CASE WHEN EXISTS
(SELECT * FROM errors e WHERE f.detail_id = e.detail_id AND e.error_code = 392)
THEN 1 ELSE 0 END) AS error_392,
(CASE WHEN EXISTS
(SELECT * FROM errors e WHERE f.detail_id = e.detail_id AND e.error_code = 401)
THEN 1 ELSE 0 END) AS error_401
FROM files f
然而,这段代码效率很低,运行速度慢,而且运行时间长。我怎样才能重写这段代码使它更有效率?我怎样才能优化它?
先谢谢你的帮助。
2条答案
按热度按时间yqkkidmi1#
由于您没有选择文件号或名称,因此通过聚合错误表可以获得几乎相同的结果:
在聚合函数中使用布尔表达式称为条件聚合。
上面的查询没有返回detail_id,虽然它出现在文件中,但不会出现在错误中。如果需要,可以将上面的结果外部连接到文件表。
vmjh9lq92#
而且,我认为你应该有一个索引:
这在任何情况下都可以提高性能。