从给定的集合中查找表中的缺失值

时间:2018-11-29 12:04:57

标签: sql oracle

假设存在一个名为“ allvalues”的表,该表的列名为“ column”。 此列包含值“ A”到“ J”,而缺少“ H”。

为我提供了从“ G”到“ J”的一组值。

如何查询表以查看列中缺少我的集合的哪个值?

以下内容无效:

select * from allvalues where column not in ('G', 'H', 'I', 'J')

此查询将导致A, B, C, D, E, F, H,其中也包含给定集中未包含的值。

很明显,在这么小的数据池中,丢失的值显而易见,但是可以想象表中有更多条目,而集合更大。

3 个答案:

答案 0 :(得分:2)

您需要从一个(派生的)表开始,其中包含您要检查的值。一种显式方法是:

with testvalues as (
      select 'G' as val from dual union all
      select 'H' as val from dual union all
      select 'I' as val from dual union all
      select 'J' as val from dual 
     )
select tv.val
from testvalues tv
where not exists (select 1 from allvalues av where av.column = tv.val);

通常,值通过查询或表产生。因此,明确声明它们是不必要的-您可以用子查询替换该部分。

答案 1 :(得分:0)

取决于可以使用的SQL语法,但是基本上您想检查表中的allvalues和多余的值。

例如:

SELECT *                                 
FROM ALLVALUES                           
WHERE COLUMN NOT IN (                    
( select s.column from allvalues s )     
and column not in ('G', 'H', 'I', 'J') 

答案 2 :(得分:0)

这将起作用:

    select * from table1;
    G
    H
    I
    J

    select * from table1
    minus
    (select * from table1
    intersect 
    select column from allvalues
    )
sample input:

select * from  ns_table10;
G
H
I
J
SELECT * FROM ns_table11;
A
B
C
D
E
F
G
J
I
select * from ns_table10
minus
(select * from ns_table10
intersect 
select * from ns_table11
);

output:
H