sqlserver中的复杂存储过程

sqlserver中的复杂存储过程,sql,sql-server,Sql,Sql Server,我有两张桌子: [人] PEOPLE_ID, LAST_NAME, FIRST_NAME, MIDDLE_NAME [地址] ADDRESS_ID, PEOPLE_ID, ADDRESS, EMAIL (3, 1, 120 Woodland Road, <mailto:lyndon@foo.com> Lyndon@foo.com ) 执行该查询时,出现错误: 子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情 有人能帮我解决这个问题吗?非常

我有两张桌子:

[人]

PEOPLE_ID, LAST_NAME, FIRST_NAME, MIDDLE_NAME
[地址]

ADDRESS_ID, PEOPLE_ID, ADDRESS, EMAIL 
(3, 1, 120 Woodland Road, <mailto:lyndon@foo.com> Lyndon@foo.com  )
执行该查询时,出现错误:

子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情


有人能帮我解决这个问题吗?非常感谢。

使用
ISNULL()
COALESCE()
函数将查询更改为如下所示

SELECT ppl.FIRST_NAME + ' ' + ppl.Last_Name as Name,
ISNULL(Addr.Email, 'No Email') as Email
FROM [Address] AS Addr 
JOIN [PEOPLE] AS ppl ON ppl.ID = Addr.PEOPLE_ID;

如果您将结果限制为每人最多一封电子邮件,那么您的查询就可以了。在这种情况下,由于缺少有关您要执行的操作的信息,以下查询采用了选择任意电子邮件的方法:

SELECT ppl.Last_Name, 
       ISNULL( (SELECT TOP 1 Addr.Email 
                FROM [Address] AS Addr 
                WHERE ppl.ID = Addr.PEOPLE_ID
               ), 'No Email') as Email
FROM PEOPLE AS ppl;
如果您想为每封电子邮件单独设置一行,可以使用“LEFT JOIN”

SELECT p.last_name, COALESCE(a.Email, 'No Email') as email
FROM people p LEFT JOIN
     address a
     on a.people_id = p.id;

那么,当存在多封电子邮件时,您希望查询返回什么?您应该避免将此类问题描述为“复杂”。既然你目前不知道如何解决这个问题,那么根据定义,你就无法判断它的复杂性。对于任何知道问题解决方案的人,他们可能不会将其描述为复杂
SELECT p.last_name, COALESCE(a.Email, 'No Email') as email
FROM people p LEFT JOIN
     address a
     on a.people_id = p.id;