1
votes

Répertorier uniquement les noms répétés

SELECT personid, last, first, section FROM   d 01 WHERE  EXISTS 
   (SELECT * FROM d 02 WHERE  02.last = 01.last AND 02.first = 01.first )

0 commentaires

3 Réponses :


0
votes

Vous devez vérifier que les 2 lignes ont des identifiants différents:

| personid | last | first | section |
| -------- | ---- | ----- | ------- |
| 5        | D    | Sam   | y3      |
| 6        | D    | Sam   | u3      |

Toujours qualifier les noms de colonnes avec le nom / alias de la table et ne pas utiliser de nombres comme alias à moins qu'ils ne soient inclus dans des backticks ou crochets.
Consultez la démo .
Résultats:

SELECT d1.personid, d1.last, d1.first, d1.section 
FROM d d1 WHERE EXISTS (
  SELECT * 
  FROM d d2 
  WHERE d1.personid <> d2.personid AND d2.last = d1.last AND d2.first = d1.first 
)


1 commentaires

Merci. Cela prend tout son sens maintenant.



1
votes

Vous pouvez simplement faire un décompte des fenêtres et filtrer par cela:

select personid, first, last, section
from (
    select t.*, count(*) over(partition by first, last) cnt
    from mytable t
) t
where cnt > 1


0 commentaires

0
votes

Une autre façon de donner les mêmes résultats que l'autre réponse acceptée:

SELECT personid,
   A.firstName,
   A.lastName,
   section
FROM personTable as A
INNER JOIN (
    SELECT  
        firstName,
        lastName,
        CASE 
            WHEN COUNT(*)>1 THEN 'Yes'
            ELSE 'Null' , AS UseName
    FROM 
        personTable
    WHERE UseName='Yes') as B 
 ON A.firstName=B.firstName AND A.lastName=B.lastName

Cette solution se sous-demande. Puisqu'il s'agit d'une jointure interne, il ne tirera que les valeurs qui se joignent à la sous-requête. Puisque j'ai filtré tout ce qui a un nombre inférieur à 2, seuls les doublons correspondent.


0 commentaires