2015-06-04 3 views
2

у меня есть база данных SQL Server с тремя столами:Возвращение записей, даже если они не существуют в соединяемых таблицах

ГРУППЫ

GroupID GroupTitle 
    1  Group 1 
    2  Group 2 
    3  Group 3 
    4  Group 4 

ЧЛЕНЫ

MemberID MemberName 
19  Jon 
20  Marie 
21  Andrew 

ЧЛЕНЫ ГРУППЫ

MembersGroupID GroupID MemberID 
221    1  20 
231    1  21 

Я сделал left join и получил следующий результат:

GroupID GroupTitle MemberID IsPartOfGroup MemberName 
1  Group 1  20  Yes   Marie 
1  Group 1  21  Yes   Andrew 
2  Group 2  NULL  No   NULL 
3  Group 3  NULL  No   NULL 
4  Group 4  NULL  No   NULL 

Это мой присоединиться:

select g.GroupID 
,g.GroupTitle 
,mg.MemberID 
,IsPartOfGroup = case when mg.MembersGroupID is null then 'No' else 'Yes' end 
from groups g 
left join membergroups mg on g.GroupID = mg.GroupID 
left join members m on m.memberid = mg.MemberID 

Но то, что я хочу, это следующий результат:

GroupID GroupTitle MemberID IsPartOfGroup MemberName 
1  Group 1  19  No   Jon 
2  Group 2  19  No   Jon 
3  Group 3  19  No   Jon 
4  Group 4  19  No   Jon 
1  Group 1  20  Yes   Marie 
2  Group 2  20  No   Marie 
3  Group 3  20  No   Marie 
4  Group 4  20  No   Marie 
1  Group 1  21  Yes   Andrew 
2  Group 2  21  No   Andrew 
3  Group 3  21  No   Andrew 
4  Group 4  21  No   Andrew 

Другими словами, Я хочу получить всех членов и группы, в которых они входят, а также те, кем они не являются.

Возможно ли это?

ответ

1

Вам необходимо сначала до cross join и left join на MemberGroups стол. Попробуйте это:

select g.GroupID, 
     g.GroupTitle, 
     m.MemberID, 
     m.MemberName, 
     case when mg.MembersGroupID is null then 'No' else 'Yes' end as IsPartOfGroup 
from GROUPS g 
cross join MEMBERS m 
left join MEMBER_GROUPS mg on g.GroupID = mg.GroupID and m.MemberID = mg.MemberID 
0
select g.GroupID 
,g.GroupTitle 
,mg.MemberID 
,IsPartOfGroup = case when mg.MembersGroupID is null then 'No' else 'Yes' end 
from groups cross join membergroups 
left join members m on m.memberid = mg.MemberID