如何从联接中选择第一行,该联接在主键上返回多个行


15

这与以下问题有关: 连接多个表导致重复的行

我有两个要加入的表。他们共享密钥。人员表的每个主键只有一个名称,但是电子邮件表的每个personId都有多个电子邮件。我只想显示每人的第一封电子邮件。目前我每人多行,因为他们有多封电子邮件。我正在运行SQL Server 2005。

编辑:这是T-SQL。第一封电子邮件实际上是每人的第一封电子邮件行。

编辑2:我看到的第一封电子邮件将是SQL在查询过程中在连接中显示的第一封电子邮件行。没关系显示哪个电子邮件。只显示不超过一封电子邮件。我希望这一点更加清楚。

Table1: Person
Table2: Email

Select Person.PersonName, Email.Email
From person 
left join on Person.ID=Email.PersonId;

3
“第一封”电子邮件是什么意思?什么排序标准确定“第一”?
Mann进行排队

1
您尝试过前1名吗?
Racer SQL

3
您正在使用哪个DBMS?Postgres?甲骨文?
a_horse_with_no_name 2015年

3
“人均第一封电子邮件行”并没有真正告诉我们什么。“第一”按什么标准?SQL表没有固有的顺序。
–ypercubeᵀᴹ2015年

5
好吧,这是一个有效的标准:“我不在乎哪一行,只有一行”。
ypercubeᵀᴹ

Answers:


18
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.)是否使用发件人(选择Person.PersonName,Email.Email,ROW_NUMBER()OVER(PARTITION BY Person.ID或ORDER BY Email.Email)作为AS RN从我离开的人在Person.ID =上加入别名Email.PersonId)A和2.),以便您可以使用A作为表来引用这两列?
normandantzig 2015年

4
括号内的内容称为派生表。这是一个有效的表,就像基表一样,但是它的生存期仅在查询执行期间。它必须具有名称(或别名),并且@sabin选择为其命名A。该表有3列(“人名”,“电子邮件”,“ RN”),并且在括号之外,您可以A.Emailtablename.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子句中的表声明。
曼恩

1
@normandantzig在大多数情况下,两者在SQL Server中均有效。
培根片,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.