2012-06-06 25 views
6

我有两个表,表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

+5

什么是“一些小数量” –

+0

赞对于表A而言,L1 = 118.4363,但对于表B,L1 = 118.445428 –

+0

@cool_cs我遇到了类似的问题,我试图实现这个解决方案,但是我不太了解语句中的语法=>什么是'l1' ,'l2'和'L1'和'L2'指的是? –

回答

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 
+0

如果容差变化,会发生什么 –

+2

@cool_cs - 那么容差应该是*变量*。 –

+0

@cheeken谢谢你的回答。我遇到了一个类似的问题,我试图实现这个解决方案,但我不太明白(也是从问题中)语句中的语法=>什么是'l1','l2'和'L1'和' L2'是指? –

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; 
1

你不能要求发动机回到这“一些小的量”不同的人。

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

喜欢行,其中A-B> 5一个 - B> X一个 - B < X + 10。例如

0

尝试在Sybase或SQL Server中使用循环函数,使118与118匹配。对于其他DBMS找到一个等价的圆。

迈克

0

为@ cheeken的回答工作,你必须把分号在最后的查询,否则将无法正常工作:

SELECT * FROM 
    TableA l1, TableB l2 
WHERE 
    ABS(l1.L1-l2.L1) < 0.1 
    AND 
    ABS(l1.L2-l2.L2) < 0.1;