假设我有两个具有相同列结构的表。
Table A
Key Value
a 123.452
b 127.851
c 128.478
Table B
Key Value
a 124.46
b 127.578
d 576
现在我想显示表A中表B中没有的所有行。但是还有一个条件是忽略值列中+/- 0.01的差异并将它们视为相等。
所以结果应该是
Key Value
b 127.851
c 128.478
我知道可以使用减号查询,但不会考虑附加条件。
答案 0 :(得分:1)
一种方法不存在:
select a.*
from a
where not exists (select 1
from b
where abs(b.value - a.value) <= 0.01
);
答案 1 :(得分:1)
Actuall这两个数据都是从同一个表中获取的。我有一个日期列,它将提供不同的行集。
您可以使用NOT EXISTS
并使用BETWEEN
比较值:
Oracle 11g R2架构设置:
CREATE TABLE table_name ( date_column, key, value ) AS
SELECT DATE '2017-01-01', 'a', 123.452 FROM DUAL UNION ALL
SELECT DATE '2017-01-01', 'b', 127.851 FROM DUAL UNION ALL
SELECT DATE '2017-01-01', 'c', 128.478 FROM DUAL UNION ALL
SELECT DATE '2017-01-02', 'a', 123.46 FROM DUAL UNION ALL
SELECT DATE '2017-01-02', 'b', 127.841 FROM DUAL UNION ALL
SELECT DATE '2017-01-02', 'd', 576 FROM DUAL;
查询1 :
SELECT key, value
FROM table_name a
WHERE date_column = DATE '2017-01-01'
AND NOT EXISTS(
SELECT 1
FROM table_name b
WHERE date_column = DATE '2017-01-02'
AND a.key = b.key
AND a.value BETWEEN b.value - 0.01 AND b.value + 0.01
)
<强> Results 强>:
| KEY | VALUE |
|-----|---------|
| c | 128.478 |
答案 2 :(得分:1)
试试这个
SELECT a.*
FROM a LEFT OUTER JOIN b ON a.key = b.key
WHERE (b.key IS NULL OR ABS (a.VALUE - b.VALUE) < 0.01);
对于您的数据b
,由于difference
为more
而不是0.01
答案 3 :(得分:0)
您可以在自己身上使用LEFT JOIN
。
SELECT a.key,a.value FROM
TableA a LEFT JOIN TableA b
ON a.key = b.key
AND ABS(a.value - b.value ) <= 0.01
WHERE TRUNC(a.dt) = :date1
AND TRUNC(b.dt) = :date2
AND b.value IS NULL;