这是一个有点奇怪的问题,所以最好的提问方式是举个例子。我有一份客户名单。我想获取在 CourseHistory 表或 Access 表(或两者)中有相应条目的任何客户。

我想要获取这些客户的最佳单个查询(无子查询)。我想出了

SELECT
   c.cusid
FROM
   Customers c
   CROSS JOIN Realms r
   LEFT JOIN Course.CourseHistory ch ON (c.cusid = ch.cusid)
   LEFT JOIN Access a ON (c.cusid = a.cusid AND r.realmid = a.realmid)
WHERE
   realmname = 'Course'
   AND COALESCE(chid, accid)

这有效,但速度明显慢,可能是因为它必须对 Customers 进行全面扫描。由于 CourseHistoryAccess 可以为空并且结果仍然有效,因此它们必须保持连接。是否有更正确的方法来执行此查询?

最佳答案

摆脱那个 CROSS JOIN 到 Realms 和 INNER JOIN 该表到 Access 代替。

SELECT
   c.cusid
FROM
   Customers c
   LEFT JOIN Course.CourseHistory ch ON (c.cusid = ch.cusid)
   LEFT JOIN Access a
       INNER JOIN realms r
           ON a.realmid = r.realmid
               AND r.realmname = 'Course'
       ON c.cusid = a.cusid
WHERE
   COALESCE(chid, accid)

关于mysql - 用于检查记录是否存在于任一/或表中的最佳单个查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8248951/

10-13 03:29