使用 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: