我有两个表,表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
即使有匹配的记录,我也会得到一个空集。我该如何解决这个问题?
示例:
表A的L1 = 118.4363,但表B L1 = 118.445428答案 0 :(得分:13)
不要检查是否相等,而是检查差异是否低于某个阈值(例如,0.1,如下例所示)。
SELECT * FROM
TableA l1, TableB l2
WHERE
ABS(l1.L1-l2.L1) < 0.1
AND
ABS(l1.L2-l2.L2) < 0.1
答案 1 :(得分: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;
答案 2 :(得分:1)
你不能要求引擎返回“少量”不同的引擎。
您可以选择差值“abs(a - b)”在两个固定值之间的行。
与 a-b&gt;的行类似5 或 a - b&gt; x 和 a - b&lt; X + 10 即可。例如
答案 3 :(得分:0)
尝试在Sybase或SQL Server中使用round函数,因此118匹配118.对于其他DBMS,找到一个等效的圆形。
麦克
答案 4 :(得分:0)
为了@ cheeken的工作答案,你必须在最后一个查询中加一个分号,否则它不会起作用:
SELECT * FROM
TableA l1, TableB l2
WHERE
ABS(l1.L1-l2.L1) < 0.1
AND
ABS(l1.L2-l2.L2) < 0.1;