sql - 在 where 子句的左侧如何使用合并函数?
问题描述
我有以下要优化的查询
SELECT DISTINCT
ues.user_id,
ues.user_type,
ues.owner
FROM user_entitled_service ues
LEFT JOIN user_resource_group urg
ON urg.org_id = ues.org_id AND urg.user_id = ues.user_id AND urg.service = ues.service
INNER JOIN user_assignment ua
ON ua.org_id = ues.org_id AND ua.user_id = ues.user_id AND ua.service = ues.service
WHERE ues.org_id = :orgId AND ues.service = CAST(:service AS service)
AND COALESCE(urg.resource_group_id, '') = :resourceGroupId
AND NOT EXISTS (
SELECT org_id, user_id, service, cluster_id
FROM user_discover_state
WHERE status = '${UserDiscoverStatus.found}'
AND org_id = ues.org_id AND user_id = ues.user_id AND service = ues.service)
我希望能够在 resource_group_id 上使用索引,但由于它使用合并函数,因此不能在那里使用索引。我不清楚的是为什么在左侧使用合并,我见过的大多数查询都在右侧使用它,这更有意义,因为我们正在将列(键)与值匹配,它是如何在右侧使用时有效吗?我们可以将它用于索引吗?
解决方案
在不知道您的确切数据和查询逻辑的情况下,我无法直接评论COALESCE
. 我能做的是重写逻辑,使其变得可分析(即可以使用索引):
AND COALESCE(urg.resource_group_id, '') = :resourceGroupId
这变成:
AND urg.resource_group_id = :resourceGroupId OR
urg.resource_group_id IS NULL AND :resourceGroupId = ''
推荐阅读
- python - 无法通过 xpath 通过 Selenium 访问元素
- ios - IOS后台如何实现接口的周期性校验
- python - Python 中的“TypeError:‘NoneType’对象不可下标”
- object-detection - 可以在yolov4算法中应用曝光融合技术吗?
- google-earth-engine - GEE Sentinel-3(投影?)问题
- python - 如何让迭代更快?
- c - 在 C 中的文件之间切换函数
- maven - GitHub maven CI error Missing commit
- azure - 使用 mongosh 时出错,报错 MongoBulkWriteError [已解决]
- google-apps-script - 如何正确从工作表中获取值