SQL等价多个OR的VS几个IN

时间:2013-10-29 18:28:34

标签: sql

给定表中的相同行。这是SQL查询:

select * from table where (a in (0,1) and b in (0,2) and c in (0,3))

逻辑上相当于这一个:

select * from table where
(a = 0 and b = 0 and c = 0)
or 
(a = 1 and b = 0 and c = 0)
or 
(a = 0 and b = 2 and c = 0)
or 
(a = 0 and b = 0 and c = 3)
or 
(a = 1 and b = 2 and c = 0)
or 
(a = 0 and b = 2 and c = 3)
or 
(a = 1 and b = 0 and c = 3)
or 
(a = 1 and b = 2 and c = 3);

????

2 个答案:

答案 0 :(得分:2)

因为你问的是逻辑等价......

IN转换为一系列OR,所以:

a in (0,1)    →    a = 0 or a = 1
b in (0,2)    →    b = 0 or b = 2
c in (0,3)    →    c = 0 or c = 3

进行以下替换:

a = 0    →    A0
a = 1    →    A1
b = 0    →    B0
b = 2    →    B2
c = 0    →    C0
c = 3    →    C3
and      →    ∧
or       →    ∨

并考虑到conjunction's distributivity with disjunction,即

X ∧ (Y ∨ Z)  ⇔  (X ∧ Y) ∨ (X ∧ Z)

你明白了:

  (A0 ∨ A1) ∧ (B0 ∨ B2) ∧ (C0 ∨ C3) ⇒
⇒ ((A0 ∨ A1) ∧ (B0 ∨ B2) ∧ C0) ∨ ((A0 ∨ A1) ∧ (B0 ∨ B2) ∧ C3) ⇒
⇒ ((A0 ∨ A1) ∧ B0 ∧ C0) ∨ ((A0 ∨ A1) ∧ B2 ∧ C0) ∨
∨ ((A0 ∨ A1) ∧ B0 ∧ C3) ∨ ((A0 ∨ A1) ∧ B2 ∧ C3) ⇒
⇒ (A0 ∧ B0 ∧ C0) ∨ (A1 ∧ B0 ∧ C0) ∨ (A0 ∧ B2 ∧ C0) ∨ (A1 ∧ B2 ∧ C0) ∨
∨ (A0 ∧ B0 ∧ C3) ∨ (A1 ∧ B0 ∧ C3) ∨ (A0 ∧ B2 ∧ C3) ∨ (A1 ∧ B2 ∧ C3)

翻译最终结果,你得到第二个查询的条件。

答案 1 :(得分:0)

逻辑上?是。但是他们可能有 非常 不同的表现。第一个只需检查三个条件(最差),第二个可能必须检查 8 。不是说一个比另一个好,因为在确定性能时有很多因素。