以下查询对于10条记录工作正常,但要花更多时间记录:

SELECT s.a, s.b, s.c
FROM
(SELECT abc FROM h1
WHERE a IN
(SELECT a FROM h1 GROUP BY a HAVING COUNT(DISTINCT b) = 1 )) s


任何人都可以助一臂之力吗?

最佳答案

首先,不要在FROM中使用不必要的子查询,因此应这样写:

SELECT h.a, h.b, h.c
FROM h1 h
WHERE a IN (SELECT hh.a FROM h1 hh GROUP BY hh.a HAVING COUNT(DISTINCT hh.b) = 1);


这仍然会带来糟糕的表现。您想要的是a值具有单个b的所有行。所以:

select h.*
from h1 h
where not exists (select 1
                  from h1 hh
                  where hh.a = h.a and hh.b <> h.b
                 );


好多了。然后,对于此查询,您需要在h1(a, b)上建立索引。

您也可以使用JOIN编写此代码:

SELECT h.a, h.b, h.c
FROM h1 h JOIN
     (SELECT hh.a
      FROM h1 hh
      GROUP BY hh.a
      HAVING MIN(hh.b) = MAX(hh.b)
     ) hh
     ON hh.a = h.a;


这仅执行一次聚合。而且我还应该利用相同的索引。

关于java - 嵌套的选择查询对于结果而言太慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55085165/

10-11 07:02