[英]Remove correlated sub-query
您能帮我优化查询吗? 我们正在使用相关子查询来解决我们的问题。 如何提高性能并删除相关的子查询。
SELECT CAST((CASE WHEN value = 1
THEN CASE WHEN (SELECT COUNT(records)
FROM ABC
WHERE ABC.ID = XYZ.ID) > 0
THEN 1
ELSE 0 END
ELSE CASE WHEN (SELECT COUNT(records)
FROM PQR
WHERE PQR.ID = XYZ.ID) > 0
THEN 1
ELSE 0 END END) AS AA) AS COLUMN FROM XYZ
试试这个。 我已将子查询移至单独的临时表。
SELECT XYZ.id,
CASE WHEN XYZ.value = 1
THEN CASE WHEN T.cnt > 0 THEN 1 ELSE 0 END
ELSE CASE WHEN T2.cnt > 0 THEN 1 ELSE 0 END
END as column
FROM XYZ
LEFT JOIN ( SELECT id, COUNT(*) AS cnt FROM ABC
GROUP BY id) AS T ON XYZ.id = T.id
LEFT JOIN ( SELECT id, COUNT(*) AS cnt FROM PQR
GROUP BY id) AS T2 ON XYZ.id = T2.id
GROUP BY XYZ.id
另一个解决方案。 只需检查表ABC和PQR中的存在ID。 感谢评论员。
SELECT XYZ.id,
CASE WHEN XYZ.value = 1
THEN T.id IS NOT NULL
ELSE T2.id IS NOT NULL
END AS column
FROM XYZ
LEFT JOIN (SELECT DISTINCT id FROM ABC) AS T ON XYZ.id = T.id
LEFT JOIN (SELECT DISTINCT id FROM PQR) AS T2 ON XYZ.id = T2.id
您应该尝试避免在此处使用COUNT
,您不必担心在每种情况下有多少行,无论它们是否EXIST
。
MySQL中的布尔条件分别针对TRUE
和FALSE
返回1
或0
,因此您可以节省很多语法。
我认为这是您想要的,已大大简化:
SELECT (x.value =1 AND EXISTS (SELECT 1 FROM ABC a WHERE a.id = x.id))
OR
(x.value !=1 AND EXISTS (SELECT 1 FROM PQR p WHERE p.id = x.id)) column
FROM XYZ x
或可能:
SELECT EXISTS (SELECT 1 FROM ABC a WHERE a.id = x.id) column
FROM XYZ x
WHERE x.value = 1
UNION ALL
SELECT EXISTS (SELECT 1 FROM PQR p WHERE p.id = x.id)
FROM XYZ x
WHERE x.value != 1
或者,如果您喜欢这种情况:
SELECT CASE
WHEN x.value = 1 THEN EXISTS (SELECT 1 FROM ABC a WHERE a.id = x.id)
ELSE EXISTS (SELECT 1 FROM PQR p WHERE p.id = x.id)
END column
FROM XYZ x
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.