web-dev-qa-db-fra.com

Comment sélectionner la première ligne d'une jointure qui renvoie plusieurs lignes sur la clé primaire

Ceci est lié à cette question: La jointure de plusieurs tables entraîne des lignes en double

J'ai deux tables que je rejoins. Ils partagent une clé. La table des personnes a un nom par clé primaire mais la table des e-mails a plusieurs e-mails par personId. Je souhaite afficher uniquement le premier e-mail par personne. Actuellement, je reçois plusieurs lignes par personne car elles ont plusieurs e-mails. J'exécute SQL-Server 2005.

EDIT: Ceci est T-SQL. Le premier e-mail est littéralement la première ligne d'e-mail par personne.

Edit 2: Premier e-mail tel que je le vois, ce serait la première ligne d'e-mail qui apparaît dans la jointure pendant que SQL fonctionne via la requête. Peu importe quel e-mail apparaît. Seulement, pas plus d'un e-mail n'apparaît. J'espère que cela clarifie les choses.

Table1: Person
Table2: Email

Select Person.PersonName, Email.Email
From person 
left join on Person.ID=Email.PersonId;
15
normandantzig
SELECT
    A.PersonName, A.Email
FROM
        (
        Select Person.PersonName, Email.Email
            ,ROW_NUMBER() OVER(PARTITION BY Person.ID ORDER BY Email.Email) AS RN
        From person 
        left join Email on Person.ID=Email.PersonId
        ) A
WHERE A.RN = 1
18
Sabin Bio

J'utiliserais une application externe pour cela, je la trouve plus lisible.

Select Person.PersonName, coalesce(Email.Email,'No email found.') as Email
From person 
outer apply (
  select top(1) Email.Email 
  from Email 
  where Person.ID=Email.PersonId
  order by <whatever suits you>
) as Email;
13
Mister Magoo

Comme peu importe quel e-mail apparaît. Je pense que le suivant est très direct.

Select Person.PersonName,  MIN(Email.Email)
From person 
left join email 
on Person.ID=Email.PersonId
group by Person.Id, Person.PersonName
5
JGA
select
  P.PersonID,
  (SELECT TOP 1 E.Email FROM Email E WHERE E.PersonID = P.PersonID ORDER BY <pick your column here>)
from
  Person P
3
Queue Mann