Запрашивая таблицу «многие ко многим» - PullRequest
0 голосов
/ 24 ноября 2011

Я пытаюсь запросить таблицу, и мне трудно разобраться в запросе.

Это мои таблицы (упрощенно):

Member
ID  | NAME
1   | Frans
2   | Eric
3   | Stephan
4   | Kris

Evenement
ID  | NAME
1   | Picknic
2   | Party
3   | Movie

Evenement
ID_EVENEMENT    | ID_MEMBER 
1               | Kris
1               | Stephan
1               | Eric
2               | Eric
2               | Frans
3               | Frans
3               | Stephan

Хорошо,запрос, который я хочу сделать, это:

Я хочу

select
    member_evenement.ID_MEMBER and member_evenement.ID_EVENEMENT
from
    member_evenement
where
    member.ID on member_evenement.ID_MEMBER
where
    member_evenement.ID_MEMBER does not exist
        for each member_evenement.ID_EVENEMENT

отдельно.

Я использую SQL Server 2008 R2

Я надеюсьЯ достаточно хорошо объяснил свой вопрос.

Если это мои базовые таблицы

Member
ID  | NAME
1   | Frans
2   | Eric
3   | Stephan
4   | Kris

Evenement
ID  | NAME
1   | Picknic
2   | Party
3   | Movie

Member_Evenement
ID_EVENEMENT    | ID_MEMBER 
1               | Kris
1               | Stephan
1               | Eric
2               | Eric
2               | Frans
3               | Frans
3               | Stephan

, то результат моего запроса должен выглядеть следующим образом:

Evenement
ID_EVENEMENT    | ID_MEMBER | MEMBER_NAME   | EVENEMENT_NAME
1               | 1         | Frans         | Picknic
2               | 3         | Stephan       | Party
2               | 4         | Kris          | Party
3               | 2         | Eric          | Movie
3               | 4         | Kris          | Movie

Ответы [ 3 ]

1 голос
/ 24 ноября 2011
SELECT e.ID AS ID_EVENEMENT, m.ID AS ID_MEMBER, 
  FROM Evenement e, Member m
EXCEPT
SELECT ID_EVENEMENT, ID_MEMBER 
  FROM member_evenement;
1 голос
/ 25 ноября 2011

Другая возможность, которая дает тот же план выполнения, что и ответ Марка Баннистера и один на следующий, когда следующий ответ:

SELECT member.id AS memberid, evenement.id AS evenementid 
FROM member 
CROSS JOIN evenement WHERE
  NOT EXISTS(
    SELECT NULL AS [Empty] 
    FROM member_evenement 
    WHERE member_evenement.memberid = member.id 
    AND member_evenement.evenementid = evenement.id
  )
1 голос
/ 24 ноября 2011

Чтобы вернуть все комбинации члена и вечера, которые не записаны в таблице member_evenement, попробуйте следующее:

select e.id id_evenement,
       m.id id_member,
       m.name member_name,
       e.name evenement_name
from member m
cross join evenement e
left join member_evenement me
on e.id = me.id_evenement and m.id = me.id_member
where me.id_evenement is null or me.id_member is null

(при этом предполагается, что id_member является фактически идентификатором члена, а не их именем, какобразец данных.)

...