Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite子查询:“IN”外部查询的结果_Sqlite_Subquery - Fatal编程技术网

SQLite子查询:“IN”外部查询的结果

SQLite子查询:“IN”外部查询的结果,sqlite,subquery,Sqlite,Subquery,我有两张桌子。我想获得每个user.name的重复对a、b的数量 使用者 配对 在上述示例中,结果应为: name | id | c ------------------- "Alice" | 0,2 | 1 "Bob" | 1 | 0 当每个用户只有一个id时,我可以这样做: SELECT name, id, ( SELECT COUNT(*) FROM pair JOIN pair AS p USING (id, a, b) WHERE id = us

我有两张桌子。我想获得每个user.name的重复对a、b的数量

使用者

配对

在上述示例中,结果应为:

name    | id   | c
-------------------
"Alice" |  0,2 | 1
"Bob"   |  1   | 0
当每个用户只有一个id时,我可以这样做:

SELECT name, id, (
    SELECT COUNT(*) FROM pair JOIN pair AS p USING (id, a, b)
    WHERE id = user.id AND pair.rowid < p.rowid
) AS c FROM user;
我想知道有没有一种简单有效的方法,比如在中将WHERE子句从pair.id=user.id改为pair.id

如果数据库能够按顺序遍历行,而不必对表进行排序,则可以加快按名称分组操作。 这可以通过名称列上的索引来完成,而另一列则使其成为一个索引,这只会有一点帮助:

CREATE INDEX user_name_id_index ON user(name, id);
查询通过id、a和b值查找对行;可以使用以下列上的索引加快这些查找:

CREATE INDEX pair_id_a_b_index ON pair(id, a, b);
要帮助查询优化器在选择索引时做出更好的决策,请运行

查询优化器不断改进;如果可能的话,请联系我们


要检查查询是如何执行的,请查看命令的输出。

您有索引吗?@CL.No。如果我有索引,这会更容易吗?这意味着我可以通过在表上创建索引来加快原始查询的速度。但是在子查询中是否有类似pair.id的内容?或者我就是做不到?有点像pair.id在哪里;在您的查询中,user.id列表被称为t。否,我的意思是,我可以像在单个id的情况下那样,直接使用WHERE id=user.id从外部查询使用,而不必将其作为表t重新查询吗?
SELECT name, GROUP_CONCAT(id), (
    WITH t AS (SELECT id FROM user AS u WHERE name = user.name)
    SELECT COUNT(*) FROM pair JOIN pair AS p USING (a, b)
    WHERE pair.id IN t AND p.id IN t AND pair.rowid < p.rowid
) AS c FROM user GROUP BY name;
/* This will not work! "Error: no such table: user.id" */
SELECT name, GROUP_CONCAT(id), (
    SELECT COUNT(*) FROM pair JOIN pair AS p USING (a, b)
    WHERE pair.id IN user.id AND p.id IN user.id AND pair.rowid < p.rowid
) AS c FROM user GROUP BY name;
CREATE INDEX user_name_id_index ON user(name, id);
CREATE INDEX pair_id_a_b_index ON pair(id, a, b);