SELECT personid, last, first, section FROM d 01 WHERE EXISTS (SELECT * FROM d 02 WHERE 02.last = 01.last AND 02.first = 01.first )
3 Réponses :
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 )
Merci. Cela prend tout son sens maintenant.
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
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.