2012-06-06 46 views
6

Tôi có hai bảng, Bảng A và Bảng B. Tôi có hai thuộc tính L1 và L2 cho mỗi bảng. Tôi đang cố gắng đầu ra tất cả các hàng cho cả hai bảng nơi L1 và L2 là bình đẳng cho cả hai bảng. Vấn đề là L1 một L2 có thể khác với một số lượng nhỏ của tôi. Vì vậy, khi tôi chạy:So sánh hai số xấp xỉ bằng

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

Tôi nhận được bộ trống mặc dù có hồ sơ phù hợp. Làm thế nào để giải quyết vấn đề này?

Ví dụ:

L1 = 118,4363 cho Bảng A nhưng đối với Bảng B L1 = 118,445428

+5

"một số lượng nhỏ" –

+0

là gì Giống như L1 = 118.4363 cho Bảng A nhưng đối với Bảng B L1 = 118.445428 –

+0

@cool_cs Tôi đã gặp phải một vấn đề tương tự và tôi đang cố triển khai giải pháp này, nhưng tôi không hiểu rõ cú pháp trong câu lệnh => 'l1' là gì , 'l2' và' L1' và 'L2' đề cập đến? –

Trả lời

13

Thay vì kiểm tra cho bình đẳng, kiểm tra xem sự khác biệt là bên dưới một số ngưỡng (ví dụ, 0.1, như trong ví dụ phía dưới).

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

Điều gì sẽ xảy ra nếu dung sai thay đổi mặc dù –

+2

@cool_cs - Sau đó, dung sai phải là * biến *. –

+0

@cheeken Cảm ơn câu trả lời của bạn. Tôi đã gặp phải một vấn đề tương tự và tôi đang cố gắng thực hiện giải pháp này, nhưng tôi không hiểu rõ (cũng từ câu hỏi) cú pháp trong câu lệnh => 'l1',' l2' và 'L1' và' là gì L2' đề cập đến? –

5

Bạn sẽ cần phải tạo ra một số dung sai, như nói sự khác biệt 0,01. Sau đó tính toán giá trị tuyệt đối của hai khi trừ và xem nếu nó nằm trong dung sai của bạn

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

Bạn không thể yêu cầu động cơ trả lại số khác "một lượng nhỏ".

Bạn có thể chọn các hàng có sự khác biệt "abs (a - b)" nằm giữa hai giá trị cố định.

Giống như hàng nơi một-b> 5 hoặc a - b> xa - b < x + 10. ví dụ

0

Hãy thử sử dụng hàm tròn trong Sybase hoặc SQL Server để 118 đối sánh 118. Đối với các DBMS khác, hãy tìm một vòng tương đương.

mike

0

Để trả lời @ cheeken để làm việc, bạn phải đặt một dấu chấm phảy truy vấn cuối cùng, nếu không nó sẽ không làm việc:

SELECT * FROM 
    TableA l1, TableB l2 
WHERE 
    ABS(l1.L1-l2.L1) < 0.1 
    AND 
    ABS(l1.L2-l2.L2) < 0.1; 
Các vấn đề liên quan