鉴于此表结构:
Table A
ID AGE EDUCATION
1 23 3
2 25 6
3 22 5
Table B
ID AGE EDUCATION
1 26 4
2 24 6
3 21 3
我想查找年龄在 2 以内且教育程度在 2 以内的两张表之间的所有匹配项。但是,我不想从 TableB 中多次选择任何行。B 中的每一行应选择 0 次或 1 次,A 中的每一行应选择一次或多次(标准左连接)。
SELECT *
FROM TableA as A LEFT JOIN TableB as B ON
abs(A.age - B.age) <= 2 AND
abs(A.education - B.education) <= 2
A.ID A.AGE A.EDUCATION B.ID B.AGE B.EDUCATION
1 23 3 3 21 3
2 25 6 1 26 4
2 25 6 2 24 6
3 22 5 2 24 6
3 22 5 3 21 3
如您所见,与整个结果集相比,输出中的最后两行重复了 B.ID 2 和 3。我希望这些行作为 A.ID = 3 的单个空匹配返回,因为它们都与以前的 A 值匹配。
期望的输出:
(请注意,对于 A.ID = 3,B 中没有匹配项,因为 B 中的所有行都已连接到 A 中的行。)
A.ID A.AGE A.EDUCATION B.ID B.AGE B.EDUCATION
1 23 3 3 21 3
2 25 6 1 26 4
2 25 6 2 24 6
3 22 5 null null null
我可以用一个简短的程序来做到这一点,但我想使用 SQL 查询来解决这个问题,因为它不适合我,而且我不会有幸看到数据或操纵环境。
有任何想法吗?谢谢