0

我想查询一个表,我很难搞清楚查询。查询一个多对多的表

这是我的表(简体):

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

你可以发布一些你尝试过的SQL吗?这可能会帮助您开始使用连接:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html,并且我无法理解您想要的内容。你是否想要Member_evenement中不存在的成员的所有记录?因此,您只需要成员到member_evenement的左连接,其中Member_evenement中的ID_Member为null。 – xQbert

+1

evenement表中有一个名为ID_Member的字段,其中包含STRING数据,而不是1,2,3,它是成员的ID?好吧,我认为你所追求的是所有不属于事件一部分的成员。所以Frans不在会员公寓1,所以Frans露面。但Member_Evenement.ID_Member中的数据是错误的(我希望) – xQbert

+0

是的,修正了这个问题,只是刷新:p – NomenNescio

回答

1
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; 
+0

谢谢<3 :-) – NomenNescio

+1

我明白了! EXCEPT类似于关系模型中的MINUS /差分运算符!如果我想显示成员和事件的名称,我所要做的就是将结果传递给一个from语句并加入它! – NomenNescio

1

要返回未记录在member_evenement成员和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_membe [R实际上是会员ID,而不是他们的样本数据中的名称)

+0

我会让马克从这里拿走它。如果有人在为你钓鱼,那么我就没有必要教你钓鱼了。 – xQbert

1

另一种可能性,这给完全相同的执行计划以马克·班尼斯特的和onedaywhen的回答如下:

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 
)