8

我有两个表,表 A 和表 B。每个表都有两个属性 L1 和 L2。我正在尝试输出两个表的所有行,其中两个表的 L1 和 L2 相等。问题是 L1 和 L2 可能与我的少量不同。所以当我运行时:

SELECT * FROM TableA l1 join TableB l2 on l1.L1 =l2.L1 and l1.L2 = l2.L2 

即使有匹配的记录,我也会得到一个空集。我该如何解决这个问题?

例子:

L1 = 118.4363 对于表 A 但对于表 B L1 = 118.445428

4

5 回答 5

16

不是检查相等,而是检查差异是否低于某个阈值(例如,0.1,如下例所示)。

SELECT * FROM 
    TableA l1, TableB l2 
WHERE 
    ABS(l1.L1-l2.L1) < 0.1 
    AND
    ABS(l1.L2-l2.L2) < 0.1
于 2012-06-06T17:01:09.077 回答
5

您将需要设计一些公差,例如 0.01 的差异。然后在减去时计算两者的绝对值,看看它是否在您的公差范围内

SET @tolerance_value = 0.01;
SELECT * 
FROM 
  TableA l1 join 
  TableB l2 
     on ABS(l1.L1 - l2.L1) < @tolerance_value and ABS(l1.L2 - l2.L2) < @tolerance_value;
于 2012-06-06T17:01:21.920 回答
1

您不能要求引擎退回“少量”不同的引擎。

您可以选择差异“abs(a - b)”在两个固定值之间的行。

就像ab > 5a - b > x a - b < x+10的行。例如

于 2012-06-06T17:04:04.560 回答
0

尝试在 Sybase 或 SQL Server 中使用 round 函数,使 118 与 118 匹配。对于其他 DBMS,找到等效的 round。

麦克风

于 2012-06-06T17:52:29.743 回答
0

为了使@cheeken 的回答起作用,您必须在最后一个查询中加上分号,否则它将不起作用:

SELECT * FROM 
    TableA l1, TableB l2 
WHERE 
    ABS(l1.L1-l2.L1) < 0.1 
    AND
    ABS(l1.L2-l2.L2) < 0.1;
于 2017-09-03T19:01:39.373 回答