2015-12-21 4 views
1

У меня есть две таблицы:комплекс хранимая процедура в SQL Server

[PEOPLE]

PEOPLE_ID, LAST_NAME, FIRST_NAME, MIDDLE_NAME 

[АДРЕС]

ADDRESS_ID, PEOPLE_ID, ADDRESS, EMAIL 
(3, 1, 120 Woodland Road, <mailto:[email protected]> [email protected] ) 

Каждый человек может иметь ноль или более адресов.

Я попытался написать хранимую процедуру, которая вернет полное имя каждого человека как одно поле и его/ее адрес электронной почты в наборе результатов. Если адрес электронной почты не существует, верните строку «Нет электронной почты».

Я пробовал:

Select 
    ppl.Last_Name, 
    (select 
     CASE 
      WHEN Addr.Email is null THEN 'No Email' 
      ELSE Addr.Email 
     END AS Email 
     FROM [Address] AS Addr 
     where ppl.ID = Addr.PEOPLE_ID 
    ) 
FROM [PEOPLE] AS ppl 

Когда я EXEC этот запрос я получил ошибку:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression

Может кто-нибудь помочь мне исправить запрос? Большое спасибо.

+2

Ну, что вы хотите, чтобы запрос возвращался при наличии более одного электронного письма? –

+1

Вы должны избегать описания таких проблем как «сложных». Так как вы этого не сделаете, в настоящее время знаете, как решить проблему, то по определению вы не можете судить о ее сложности. Для тех, кто знает решение проблемы, они не могут описывать это как сложное –

ответ

1

Изменить запрос, чтобы быть как ниже, используя 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; 
1

Ваш запрос в порядке, если вы ограничить результаты в большинстве одного адреса электронной почты на человека. Не имея информации о том, что вы хотите сделать в этом случае, следующий запрос принимает подход выбора произвольной электронной почты:

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; 
Смежные вопросы