1
votes

Évitez les doublons d'une colonne en utilisant Not exists SQL ORACLE

Comment éviter les doublons d'une colonne en utilisant distinct?

Je souhaite récupérer les passeports de la table RELATION qui n'existe pas vers la table PERSON. Cela fonctionne en utilisant le NOT EXISTS.

Mais je veux aussi imprimer le relID (peu importe lequel de chaque passeport).

ce sont mes tableaux: p >

RELATION

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

Table PERSON:

relID   passport
1       400000V     
6       823972O   

Voici le résultat que je veux.

XXX

C'est ma requête:

id   passport
1    342342X  
2    3333333T
3    1111111W

Si j'ajoute la colonne relID à la sélection, j'obtiens des valeurs en double du passeport.

Je veux seulement obtenir un PASSEPORT unique avec l'un de leurs identifiants.


0 commentaires

5 Réponses :


1
votes

Utilisez simplement l'agrégation:

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

Je ne comprends pas ce que la table person a à voir avec la question.


1 commentaires

Parce que je veux seulement obtenir les passeports qui n'apparaissent pas à la table PERSONNE. Pour cela, j'ai besoin d'utiliser un NOT EXISTS.



0
votes

utilisez min ()

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


0 commentaires

0
votes

L'ajout d'une clause group by devrait aider: -

sélectionnez min (relID), passeport de RELATION où n'existe pas (sélectionnez 1 dans PERSON où PERSON.passport = RELATION.passport) grouper par passeport;


0 commentaires

0
votes

Vous devez utiliser NOT EXISTS deux fois, pour la table PERSONNE et la table RELATION:

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

si la date est unique pour chaque passeport.
Consultez la démo .
Résultats:

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"
  ) 


0 commentaires

1
votes

Utilisez un OUTER JOIN, en vérifiant si le champ PASSPORT dans la table jointe est NULL, ce qui indique que la valeur PASSPORT de RELATION n'existe pas dans PERSON:

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 ici


0 commentaires