如何在 sqlite 中执行具有多列的 IN 查询

ama*_*shi 6 sql sqlite

我需要获取数据库中特定行的列,由多个列标识。我想使用 IN 查询批量执行此操作。

在单列情况下,很简单:

SELECT id FROM foo WHERE a IN (1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试多列时出现语法错误

SELECT id FROM foo WHERE (a,b) IN ((1,2), (3,4), (5,6))
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到这一点吗?我不能只执行两个 IN 子句,因为它可能会返回额外的行,而且也不使用多列索引。

CL.*_*CL. 4

这是 Declan_K 的想法:
为了能够使用多列索引并且不必更新单独的列,您必须将查找值放入可以连接的表中:

CREATE TEMPORARY TABLE lookup(a, b);
INSERT INTO lookup VALUES ...;
CREATE INDEX lookup_a_b ON lookup(a, b);
SELECT id FROM foo JOIN lookup ON foo.a = lookup.a AND foo.b = lookup.b;
Run Code Online (Sandbox Code Playgroud)

(索引并不是真正必要的;如果省略它,SQLite 查询优化器将被迫查找表lookup中的记录foo,而不是相反。)

如果您想避免使用临时表,可以使用子查询动态构造它:

SELECT id
FROM foo
JOIN (SELECT 1 AS a, 2 AS b UNION ALL
      SELECT 3     , 4      UNION ALL
      SELECT 5     , 6               ) AS lookup
 ON foo.a = lookup.a
AND foo.b = lookup.b
Run Code Online (Sandbox Code Playgroud)

这仍然可以使用 上的索引foo(a,b)