sql - 你如何做一个在sqlite中有多个列的IN查询

标签 sql sqlite

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

在单列情况下,这很容易:

SELECT id FROM foo WHERE a IN (1,2,3,4)

但是当我尝试多列时出现语法错误
SELECT id FROM foo WHERE (a,b) IN ((1,2), (3,4), (5,6))

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

最佳答案

这是 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;

(索引并不是真正必要的;如果省略它,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

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

关于sql - 你如何做一个在sqlite中有多个列的IN查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18363276/

相关文章:

python - sqlite3.ProgrammingError : Incorrect number of bindings supplied. 当前语句使用2,并且提供了0

sql - 如何避免出现游标以及其他方法?

MYSQL更新具有不同值的单列

c# - 尝试按动态属性对 IQueryable 进行排序

mysql - 在 sql db 中存储已读文章的最佳方法是什么?

mysql - 当我的列是 INT(10) 时,为什么我不能插入 10 位数字

c++ - 如何在 SQLite 中列出临时表/ View ?

sql - 如何只保留表格的一行,删除重复的行?

linux - EOT 字符坐在终端提示上是一个问题吗?

sql - SQLite中ANY关键字的替代