web-dev-qa-db-ja.com

主キーで複数の行を返す結合から最初の行を選択する方法

これはこの質問に関連しています: 複数のテーブルを結合すると、重複した行が生成されます

参加しているテーブルが2つあります。彼らは鍵を共有します。 personテーブルには主キーごとに1つの名前がありますが、emailテーブルにはpersonIdごとに複数のメールがあります。 1人あたりの最初のメールのみを表示します。現在、メールが複数あるため、1人に複数の行が表示されます。 SQL-Server 2005を実行しています。

編集:これはT-SQLです。最初のメールは文字通り、1人あたりの最初のメール行です。

編集2:最初のメールは、SQLがクエリを処理するときに結合に表示される最初のメール行になります。どのメールが表示されるかは関係ありません。表示されるメールは1つだけです。それがより明確になることを願っています。

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

私はこれに外側の適用を使用します、私はそれがより読みやすいと思います。

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

どのメールが表示されるかは問題ではありません。次は非常に直接的だと思います。

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