我有两个表A和B,它们具有相同的字段。 我想要做的是通过比较两个表中的不同字段来搜索表B中最近的条目。 (或基本上搜索表B中列出的A的基准) 到目前为止我所做的是:
SELECT A.Id , B.Id FROM A , B
order by ABS (a.Volume - b.Volume)+ ABS(a.FCDate-b.FCDate)+ ABS(a.IssueDate-b.IssueDate)
此查询的问题是它返回一个笛卡尔积。我想要的是对表A中的每个条目只有一个表B(例如前1)的结果。
我们举一个例子:
Table A
id Volume FCDate IssueDate
1 100 2014-01-01 2012-01-01
Table B
id Volume FCDate IssueDate
1 95 2012-07-15 2000-01-01
2 100 2014-02-15 2004-01-01
3 100 2014-02-15 2011-09-20
查询结果必须是:
A.Id B.Id
1 3
在这种情况下,使用上面的线性公式立即得到结果。但是根据我拥有的数据(+4000个条目),我有时候有3个4个结果。在这种情况下,我认为选择前1名会很好
答案 0 :(得分:2)
认为你需要一个子查询来获得A上每条记录的最小差异,然后加入B,差异是相同的。
SELECT A.Id AS aid, B.Id AS bid
FROM A
INNER JOIN
(
SELECT A.Id , MIN(ABS (a.Volume - b.Volume)+ ABS(a.FCDate-b.FCDate)+ ABS(a.IssueDate-b.IssueDate)) AS MinDiff
FROM A
CROSS JOIN B
GROUP BY A.Id
) sub0
ON A.Id = sub0.Id
INNER JOIN B
ON ABS (a.Volume - b.Volume)+ ABS(a.FCDate-b.FCDate)+ ABS(a.IssueDate-b.IssueDate) = sub0.MinDiff
考虑到JOIN所需的计算,我不希望这很快。如果B上的2条记录与A
上的单条记录具有相同的差异,那也会很困难SQL小提琴: -