Операция объединения не разрешена в подзапросе. Есть ли способ исправить это в одном запросе?

Эта доза запросов НЕ работает в Access 2000

SELECT (Members.First_Name + " " + Members.Last_Name)AS Member,
(SELECT Friend_E_Mail,
FROM    Friends,Members WHERE My_E_Mail = ? and Friend_E_Mail <> ?
UNION ALL
SELECT My_E_Mail,FROM  Friends,Members 
WHERE  Friend_E_Mail = ?and My_E_Mail <> ?) AS  E_Mail ,
(Members.First_Name) AS Name

FROM Members,Friends

Образцы таблиц

Members(all VARCHAR)     SOME DATA
First_Name               Alester Jude Carl Jones
Last_Name                A       B    C    J

FRIENDS(ALL VARCHAR)
My_E_Mail               [email protected] [email protected]  [email protected]
Friend_E_Mail           [email protected]    [email protected]   [email protected]

Желаемый результат, если ("?" в приведенном выше запросе: [email protected])

+--------------+-----------+------------+
|Member        |E_Mail     |  Name      |
+---------------------------------------+
 Alester A   [email protected]  Alester

Желаемый результат, если ("?" в приведенном выше запросе: [email protected])

+--------------+-----------+------------+
|Member        |E_Mail     |  Name      |
+---------------------------------------+
 Jude B        [email protected]  Jude
 carl C        [email protected]  Carl
 Jones J       [email protected] Jones

PS "?" являются параметрами строки запроса, которые я передаю в "?" я знаю, что это работает нормально.

МОЙ ВОПРОС: я продолжаю получать эту ошибку «Операция не разрешена в подзапросе»

это обходной запрос, который я могу использовать без использования хранимой процедуры или нескольких запросов, поскольку это должен быть ОДИН ОДИН ЗАПРОС!?

Спасибо.


person James Putin    schedule 14.05.2013    source источник
comment
Почему вы включаете членов в запросы UNION, когда и My_E_Mail, и Friend_E_Mail находятся в таблице друзей?   -  person ron tornambe    schedule 15.05.2013


Ответы (1)


Вы не можете вернуть более 1 строки в подзапросе выбора. В этом случае вы должны использовать выражение CASE.

Вы должны сделать что-то вроде этого:

SELECT (m.First_Name + " " + m.Last_Name) AS Member,
       case 
       when f1.my_email is null 
        then f2.my_e_mail
        else f1.friend_email 
       end as email,
       m.First_Name AS Name
from members m
left outer join friends f1
  on m.email = f1.my_e_mail
  and f1.friend_e_mail = ?
left outer join friends f2
  on m.email = f2.friend_e_mail
  and f2.my_e_mail = ?;

Таким образом, он вернет строку для каждого друга. Вы можете видеть, что имена полей не так хороши, попробуйте переделать это. my_e_mais не так репрезентативен.

person Rodrigo    schedule 14.05.2013
comment
@Rodigo 'SELECT (Members.First_Name + ' ' + Members.Last_Name) КАК Участник, (СЛУЧАЙ, КОГДА Friends.My_E_Mail IS NULL THEN Friends.My_E_Mail ELSE Friends.Friend_E_Mail END) КАК E_Mail, Members.First_Name КАК Имя ОТ Участников LEFT OUTER JOIN Друзья НА Members.E_Mail = Friends.My_E_Mail И Friends.Friend_E_Mail = ? LEFT OUTER JOIN Friends ON Members.E_Mail = Friends.Friend_E_Mail AND Friends.My_E_Mail = ?;' - person James Putin; 15.05.2013
comment
о, неважно, CASE доза не работает в дозе Access IIF () Большое спасибо - person James Putin; 15.05.2013
comment
1 - Вы должны указать разные псевдонимы в таблице друзей. Посмотрите мой пример. 2 - Вы можете просто изменить регистр для IIF. Если это работает, пожалуйста, примите ответ, спасибо. - person Rodrigo; 15.05.2013
comment
Вы должны использовать это так: iif(f1.my_email равно null, f2.my_e_mail, f1.friend_email) Посмотрите псевдонимы, f1 и f2. - person Rodrigo; 15.05.2013