使用 Not exists SQL ORACLE 避免列重复

Posted

技术标签:

【中文标题】使用 Not exists SQL ORACLE 避免列重复【英文标题】:Avoid duplicates of a column using Not exists SQL ORACLE 【发布时间】:2019-07-31 19:19:51 【问题描述】:

如何避免使用 distinct 重复列?

我想从表 RELATION 中获取不存在表 PERSON 的护照。这可以使用 NOT EXISTS 来工作。

但我也想打印 relID(每个护照中的哪个都没有关系)。

这些是我的桌子:

关系

relID   passport  date
1       400000V   21/07/2019
2       400000V   31/02/2019
3       400000V   31/07/2011
4       342342X   31/12/2012
5       342342X   11/10/2011
6       823972O   31/07/2019

桌人:

id   passport
1    342342X  
2    3333333T
3    1111111W

这就是我想要的结果。

relID   passport
1       400000V     
6       823972O   

这是我的疑问:

select 
     distinct passport
from RELATION
where not exists(select 1 from PERSON where PERSON.passport= RELATION.passport)

如果我将列 relID 添加到选择中,我会从护照中获得重复值。

我只想用他们的一个 relID 获得唯一的 PASSPORT。

【问题讨论】:

【参考方案1】:

只使用聚合:

select max(relid), passport
from relation
group by passport;

我不明白person 表与问题有什么关系。

【讨论】:

因为我只想要获得没有出现在 PERSON 表中的护照。为此,我需要使用 NOT EXISTS。【参考方案2】:

使用OUTER JOIN,检查连接表中的PASSPORT字段是否为NULL,表示PERSON中不存在RELATION的PASSPORT值:

SELECT r.PASSPORT, MIN(r.RELID)
  FROM RELATION r
  LEFT OUTER JOIN PERSON p
    ON p.PASSPORT = r.PASSPORT
  WHERE p.PASSPORT IS NULL
  GROUP BY r.PASSPORT
  ORDER BY r.PASSPORT

dbfiddle here

【讨论】:

【参考方案3】:

使用 min()

select min(relID),passport from table group by passport

【讨论】:

【参考方案4】:

添加 group by 子句应该会有所帮助:-

select min(relID), passport from RELATION where not exists(select 1 from PERSON where PERSON.passport= RELATION.passport) group by passport;

【讨论】:

【参考方案5】:

对于表 PERSON 和表 RELATION,您必须使用 NOT EXISTS 两次:

select r.relid, r.passport
from RELATION r
where 
  not exists (
    select 1 from PERSON 
    where passport = r.passport
  ) and
  not exists (
    select 1 from RELATION 
    where passport = r.passport and "date" > r."date"
  ) 

如果每个护照的日期都是唯一的。 请参阅demo。 结果:

> RELID | PASSPORT
> ----: | :-------
>     1 | 400000V 
>     6 | 823972O 

【讨论】:

以上是关于使用 Not exists SQL ORACLE 避免列重复的主要内容,如果未能解决你的问题,请参考以下文章

oracle_not exists和not in的用法和区别

oracle中的exists 和not exists 用法详解

Oracle SQL:WHERE NOT EXISTS 无法正常运行

oracle中in,not in和exists,not exists之间的区别

ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Linux Error:

oracle insert if not exists 语句