sql - 有没有更有效的方法来编写这个 SQL 查询来删除不同的值?

标签 sql sqlite join

我正在尝试从表 A 中选择项目,其中对于给定的约束,表 B 中存在等效的项目。表 A 中每个 id 有一行,但每个表 A 行有很多行。

select distinct A.id 
from A inner join B on B.a_id = A.id 
where B.x >= 5 and B.x <= 10;

我想知道是否有一个 SQL 连接子句可以用来确保每个表 A 行只获取一行。

据我了解,查询将找到约束,执行内部联接,然后对此执行不同的操作。如果这是正确的,并且有更好的方法来指示数据库仅从 A 中获取不同的行,我想知道。我确信有很多方法可以在查询语义的限制内解释和执行查询。我不能声称理解 explain 输出。

有没有办法简化这个过程?如果这有什么区别的话,我只能使用 SQLite。

编辑

约束子句有两个约束,在查询时定义,我现在添加了它们。我试图让问题尽可能简单,但为了回复评论的完整性,添加了额外的子句。

最佳答案

这是编写查询的另一种方法:

select A.id
from A
where A.id in (select B.a_id from B where B.x > 5)

我不认为性能会更好,但它确实消除了外部的“不同”。

我会在 MySQL 中使用另一个版本:

select A.id
from A
where exists (select 1 from B where b.x > 5 and b.a_id = a.id limit 1)

这可能更有效,因为查询可以使用索引查找并在第一个匹配处停止。如果您在 B 上有 (a_id, x) 的索引,则尤其如此。

关于sql - 有没有更有效的方法来编写这个 SQL 查询来删除不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12358046/

相关文章:

php - 如何使用类似和多个无序值进行 SQL 查询

ios4 - SQLITE3插入空值

java - 哪种方法更适合在 sqlite 数据库中存储键值对?

单个查询中的 MySQL JOIN 和 COUNT

r - 如何将列表添加到 R 中的数据框?

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - SQL - 如何格式化 SELECT

sql - 从自然连接中排除列

c# - 如何使用c#向chrome cookies文件中插入一条新记录

sql - 连接两个表时如何删除一个连接键