代码之家  ›  专栏  ›  技术社区  ›  S S

在不使用IN语句的情况下重新设计查询

  •  2
  • S S  · 技术社区  · 5 年前

    我有一个问题如下。这个查询运行得很好,但是因为我有大量的数据要检查,所以这个查询运行得比较慢。

    SELECT * from trn where concat(comp_id,cus_id) 
    IN (select concat(comp_id,cus_id) FROM cus where sid='A0001') 
    AND docdate between ('2018-01-01') and ('2018-04-30')
    
    3 回复  |  直到 5 年前
        1
  •  5
  •   dnoeth    5 年前

    这个 concat 由于无法使用索引,可能会导致这些性能问题。

    但是MySQL支持多列子查询,所以只需删除它:

    SELECT * from trn 
    where (comp_id,cus_id) IN 
            ( select comp_id,cus_id
              FROM cus 
              where sid='A0001'
            ) 
      AND docdate between ('2018-01-01') and ('2018-04-30')
    
        2
  •  3
  •   Darshan Mehta    5 年前

    你可以用 JOIN ,例如:

    SELECT DISTINCT t.*
    FROM trn t 
    JOIN cus c ON t.comp_id = c.comp_id AND t.cus_id = c.cus_id
    WHERE c.sid='A0001' AND t.docdate BETWEEN ('2018-01-01') AND ('2018-04-30');
    
        3
  •  2
  •   Yogesh Sharma    5 年前

    你可以用 EXISTS :

    SELECT t.*
    FROM trn t
    WHERE EXISTS (SELECT 1 
                  FROM cus c 
                  WHERE c.sid = 'A0001' AND c.comp_id = t.comp_id AND c.cus_id = t.cus_id
                 ) AND
          docdate between '2018-01-01' and '2018-04-30';