查询多个IN语句但没有笛卡尔积

时间:2010-05-06 14:33:59

标签: sql mysql

我怎样才能进行此类查询,例如在MySQL中

SELECT * FROM Table t 
WHERE t.a IN (1,2,3) 
AND t.b IN (4,5,6) 
AND t.c IN (7,8,9) ...

以便结果只包含三行:

t.a|t.b|t.c
---+---+---
 1 | 4 | 7
 2 | 5 | 8
 3 | 6 | 9

上面的查询当然会返回IN子句中值的所有组合,但我想只获取每个元组的第一个元素匹配的元素,每个元组的第二个元素匹配等等< / strong>即可。

有没有有效的方法可以做到这一点?

顺便说一下,这种查询或概念有一些共同的术语吗?我很难想出问题的标题,因为我不能把它写成文字......

3 个答案:

答案 0 :(得分:3)

在MSSQL中,你可以这样做:

SELECT * FROM Table t 
join (
        select 1 a, 2 b, 3 c
  union select 4 a, 5 b, 6 c
  union select 7 a, 8 b, 9 c
) x on t.a=x.a and t.b=x.b and t.c=x.c

我不确定这是否会直接转换为MySQL。

更简单的方法当然是:

SELECT * FROM Table t 
WHERE (t.a=1 and t.b=4 and t.c=7)
   or (t.a=2 and t.b=5 and t.c=8)
   or (t.a=3 and t.b=6 and t.c=9)

答案 1 :(得分:2)

SELECT  *
FROM    mytable
WHERE   (a, b, c) IN ((1, 4, 7), (2, 5, 8), (3, 6, 9))

,或更适合索引的解决方案:

SELECT  *
FROM    mytable
WHERE   (a, b, c)  = (1, 4, 7)
        OR (a, b, c)  = (2, 5, 8)
        OR (a, b, c)  = (3, 6, 9)

不幸的是,MySQL不使用IN子句中记录类型的索引。

答案 2 :(得分:0)

select t1.a, t2.b, t3.c
from Table t1
inner join Table t2 on (t1.a = 1 and t2.b = 4) or (t1.a = 2 and t2.b = 5) or (t1.a = 3 and t2.b = 6)  
inner join Table t3 on (t2.b = 4 and t3.c = 7) or (t2.b = 5 and t3.c = 8) or (t2.b = 6 and t3.c = 9)