2012-06-06 24 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;