我正在尝试从表 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/