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


14

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

参加しているテーブルが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;

3
「最初の」メールとはどういう意味ですか?「最初」を決定するソート基準は何ですか?
Queue Mann

1
トップ1を試しましたか?
Racer SQL

3
どのDBMSを使用していますか?Postgres?Oracle?
a_horse_with_no_name 2015年

3
「一人あたりの最初のメールの行は、」本当に私たちには何も教えてくれありません。どのような基準で「最初に」?SQLテーブルには固有の順序はありません。
ypercubeᵀᴹ

5
まあ、それは1つの有効な基準です。「どの行も気にしない、1つだけ」。
ypercubeᵀᴹ

回答:


17
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

1
「A」とは何ですか?テーブル名の略ですか?
normandantzig 2015年

2
@normandantzigこれはエイリアスです。
ベーコンビット2015年

1
1.)From(Select Person.PersonName、Email.Email、ROW_NUMBER()OVER(PARTITION BY Person.ID ORDER BY Email.Email)を使用して、両方のテーブルにエイリアスを設定しましたかEmail.PersonId)A And 2.)これで、Aをテーブルとして使用して両方の列を参照できますか?
normandantzig 2015年

4
括弧内は派生テーブルと呼ばれます。これはベーステーブルと同じように有効なテーブルですが、存続期間はクエリの実行中のみです。名前(またはエイリアス)が必要で、@ sabinが名前を選択しましたA。このテーブルには3つの列(PersonName、Email、RN)があり、括弧の外では、コード内の他のすべてのテーブルとA.Email同じように使用できtablename.columnnameます。
ypercubeᵀᴹ

13

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

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;

5

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

Select Person.PersonName,  MIN(Email.Email)
From person 
left join email 
on Person.ID=Email.PersonId
group by Person.Id, Person.PersonName

3
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

1
「P」とは何ですか。テーブル名の略ですか?
normandantzig 2015年

1
「P」はPersonのエイリアスです。FROM句のテーブル宣言に従います。
キューMann

1
@normandantzigどちらもほとんどの状況でSQL Serverで有効です。
ベーコンビット2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.