我怎样才能进行此类查询,例如在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>即可。
有没有有效的方法可以做到这一点?
顺便说一下,这种查询或概念有一些共同的术语吗?我很难想出问题的标题,因为我不能把它写成文字......
答案 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)