Операцията Union не е разрешена в подзаявка. Има ли начин да се коригира това в една единствена заявка?

Тази доза на заявка НЕ ​​работи в 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

Желан изход if("?" в горната заявка е: [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 са в таблицата Friends?   -  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) AS Member, (CASE WHEN Friends.My_E_Mail IS NULL THEN Friends.My_E_Mail ELSE Friends.Friend_E_Mail END) AS E_Mail, Members.First_Name AS Име FROM Членове LEFT OUTER JOIN Приятели ON Members.E_Mail = Friends.My_E_Mail И Friends.Friend_E_Mail = ? LEFT OUTER JOIN Friends ON Members.E_Mail = Friends.Friend_E_Mail И Friends.My_E_Mail = ?;' - person James Putin; 15.05.2013
comment
о, няма значение CASE dose не работи в Access IIF() dose Благодаря ви много - person James Putin; 15.05.2013
comment
1 - Трябва да поставите различни псевдоними на масата на вашите приятели. Вижте моя пример. 2 - Можете просто да промените регистъра за IIF. Ако работи, моля, приемете отговора, благодаря. - person Rodrigo; 15.05.2013
comment
Трябва да използвате така: iif(f1.my_email is null, f2.my_e_mail, f1.friend_email) Вижте псевдонимите, f1 и f2. - person Rodrigo; 15.05.2013
comment
Вижте тази връзка: sitepoint.com/forums/ . Access поддържа JOIN добре (стига да не забравяте да ги поставите в скоби) - person Rodrigo; 16.05.2013