带有条件的数字列的减号查询

时间:2017-10-30 11:59:05

标签: sql oracle

假设我有两个具有相同列结构的表。

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

我知道可以使用减号查询,但不会考虑附加条件。

4 个答案:

答案 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比较值:

SQL Fiddle

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,由于differencemore而不是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;