2012-06-06 23 views
6

Tengo dos tablas, la Tabla A y la Tabla B. Tengo dos atributos L1 y L2 para cada tabla. Estoy intentando dar salida a todas las filas para ambas tablas, donde L1 y L2 son iguales para ambas tablas. El problema es que L1 y L2 pueden diferir de mi pequeña cantidad. Entonces cuando corro:Comparando dos números que son aproximadamente iguales

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

Obtengo un conjunto vacío a pesar de que hay registros que coinciden. ¿Cómo resuelvo este problema?

Ejemplo:

L1 = 118,4363 para la Tabla A, pero para la Tabla B L1 = 118,445428

+5

lo que es "una pequeña cantidad" –

+0

igual L1 = 118.4363 para la Tabla A pero para la Tabla B L1 = 118.445428 –

+0

@cool_cs He encontrado un problema similar y estoy tratando de implementar esta solución, pero no entiendo bien la sintaxis en las declaraciones => que son 'l1' , 'l2' y' L1' y 'L2' se refieren a? –

Respuesta

13

En lugar de comprobar la igualdad, comprobar que la diferencia está por debajo de un umbral (por ejemplo, 0,1, como en el ejemplo abajo).

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

¿Qué sucede si la tolerancia varía a través de –

+2

@cool_cs? Entonces la tolerancia debe ser una * variable *. –

+0

@cheeken Gracias por su respuesta. He encontrado un problema similar y estoy tratando de implementar esta solución, pero no entiendo bien (también a partir de la pregunta) la sintaxis en las declaraciones => que son 'l1',' l2' y 'L1' y' L2' refiriéndose a? –

5

Necesitará idear cierta tolerancia, por ejemplo, una diferencia de 0.01. A continuación, calcular el valor absoluto de los dos cuando se restan y ver si está dentro de su tolerancia

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

No se puede pedir el motor para volver los que difieren en "alguna cantidad pequeña".

Se pueden elegir las filas cuya diferencia "abs (a - b)" se encuentra entre dos valores fijos.

como hileras donde a-b> 5 o a - b> xya - b < x + 10. por ejemplo

0

Trate de usar la función de ronda en Sybase SQL Server o por lo que 118 partidos 118. Para otros DBMS encontrar un equivalente ronda.

micrófono

0

Con el fin de respuesta de @ Pohoyo de trabajo, usted debe poner un punto y coma en la última consulta, de lo contrario no funcionará:

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