代码之家  ›  专栏  ›  技术社区  ›  M.J.

不使用或子句执行查询

  •  1
  • M.J.  · 技术社区  · 14 年前

    我面临一个问题。我有一个问题

    Select * from tabA 
    where (a) in (a,b,c) 
    OR b in (a,b,c) 
    

    Select * from tabA 
    where (a,b) in (a,b,c) 
    

    但这个问题似乎不起作用,请帮忙。我不想使用“或”条件。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Tony Andrews    14 年前

    如果你逻辑上需要或条件,那就是你所需要的。使用或没有错。如果对这两列都编制了索引,则查询可能只需单独运行这两个查询:

    select * from tabA 
    where a in (a,b,c);
    
    select * from tabA 
    where b in (a,b,c);
    

    优化器很可能会这样做,并将结果连接起来,如下所示:

    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=2 Bytes=256)
       1    0   CONCATENATION
       2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TABA' (Cost=2 Card=1 Bytes=128)
       3    2       INDEX (RANGE SCAN) OF 'TABA_A_IDX' (NON-UNIQUE) (Cost=1 Card=1)
       4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TABA' (Cost=2 Card=1 Bytes=128)
       5    4       INDEX (UNIQUE SCAN) OF 'TABA_B_IDX' (NON-UNIQUE) (Cost=1 Card=1)
    
        2
  •  3
  •   Randy    14 年前

    Select * from tabA  
    where (a) in (a,b,c)  
    union
    Select * from tabA  
    where b in (a,b,c)  
    

    另外,检查索引并解释计划结果-索引可能会解决原始问题。

        3
  •  2
  •   andr    14 年前

    如果使用错误的语法,如果希望对比较值,则应使用如下smth:

    select * from tabA 
    where (a,b) in ((a,b), (a,c), (b,c) etc.
    

    无论如何 in or 查询执行期间的条件。