我的数据库中有两个表:
表A
Column_A1 column_A2
A1 10
A2 20
A3 30
表B
Column_B1 column_B2
B1 11
B2 21
B3 31
B4 29
B5 30.5
我想计算表B中有多少行符合以下条件:
范围: A1±1, A2±1, A3±1, ...
例如:
B1∈[A1-1,A1 + 1]
计算这些行,返回值为1。
B2∈[A2-1,A2 + 1]
计算这些行,返回值为1。
B3∈[A3-1,A3 + 1]
B4∈[A3-1,A3 + 1]
B5∈[A3-1,A3 + 1]
计算这些行,返回值为3。
结果应该是这样的:
Column_A1 column_A2 num_match
A1 10 1
A2 20 1
A3 30 3
在其他编程语言中使用循环很容易,但是在SQL中最简单的方法是什么?感谢。
答案 0 :(得分:1)
您可以使用GROUP BY
语句并过滤不等式:
SELECT Column_A1,Column_A2,COUNT(*)
FROM A JOIN B ON column_A2-1 <= column_B2 AND column_B2 <= column_A2+1
GROUP BY Column_A1,Column_A2
答案 1 :(得分:1)
我会使用相关子查询来执行此操作:
select a.*,
(select count(*)
from b
where b.column_b2 between a.column_a2 - 1 and a.column_a2 + 1
) as num_match
from a;
注意:使用between
表示边界包含在范围内。如果这不是意图,那么使用明确的<
和>
逻辑。
许多数据库都可以利用b(column_b2)
上的索引来进行此查询。您可以在MySQL上进行测试,看看是否是这种情况。
答案 2 :(得分:1)
一个简单的查询,与OP表达语句目标的方式相匹配:
SELECT
a.`Column_A1`,
COUNT(*) as `NumMatch`
FROM `Table_A` a
JOIN `Table_B` b
ON b.`column_b2` BETWEEN a.`column_A2` - 1 AND a.`column_A2` + 1
GROUP BY a.`Column_A1`;