繁体   English   中英

删除相关子查询

[英]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中的布尔条件分别针对TRUEFALSE返回10 ,因此您可以节省很多语法。

我认为这是您想要的,已大大简化:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM