我有两个表,表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
我有两个表,表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
不是检查平等的,检查该差值低于某个阈值(例如,0.1%,如实施例中下面)。
SELECT * FROM
TableA l1, TableB l2
WHERE
ABS(l1.L1-l2.L1) < 0.1
AND
ABS(l1.L2-l2.L2) < 0.1
如果容差变化,会发生什么 –
@cool_cs - 那么容差应该是*变量*。 –
@cheeken谢谢你的回答。我遇到了一个类似的问题,我试图实现这个解决方案,但我不太明白(也是从问题中)语句中的语法=>什么是'l1','l2'和'L1'和' L2'是指? –
您需要设计一些容差,比如说相差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;
你不能要求发动机回到这“一些小的量”不同的人。
您可以选择差异“abs(a - b)”在两个固定值之间的行。
喜欢行,其中A-B> 5或一个 - B> X和一个 - B < X + 10。例如
尝试在Sybase或SQL Server中使用循环函数,使118与118匹配。对于其他DBMS找到一个等价的圆。
迈克
为@ cheeken的回答工作,你必须把分号在最后的查询,否则将无法正常工作:
SELECT * FROM
TableA l1, TableB l2
WHERE
ABS(l1.L1-l2.L1) < 0.1
AND
ABS(l1.L2-l2.L2) < 0.1;
什么是“一些小数量” –
赞对于表A而言,L1 = 118.4363,但对于表B,L1 = 118.445428 –
@cool_cs我遇到了类似的问题,我试图实现这个解决方案,但是我不太了解语句中的语法=>什么是'l1' ,'l2'和'L1'和'L2'指的是? –