【问题标题】:Querying a many to many table查询多对多表
【发布时间】:2011-11-24 13:28:33
【问题描述】:

我正在尝试查询一个表,但我很难弄清楚查询。

这是我的表格(简化版):

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

【问题讨论】:

  • 你能发布一些你试过的SQL吗?这可以帮助您开始加入:codinghorror.com/blog/2007/10/…,我无法理解您想要什么...您想要来自 Member_evenement 中不存在的成员的所有记录? IF 所以你只需要从 member 到 member_evenement 的左连接,其中 Member_evenement 中的 ID_Member 为空。
  • evenement 表有一个名为 ID_Member 的字段,其中包含 STRING 数据,而不是 1, 2,3 是成员的 ID?好的,我认为您所追求的是所有未参加活动的成员。所以 Frans 不在 member_evenement 1 中,所以 Frans 出现了。但是 Member_Evenement.ID_Member 中的数据是错误的(我希望)
  • 是的,修复了,只需刷新:p
  • 如果晚上没有会员;你希望所有成员都出席那个晚会吗? jso if 4: Dance and no records in Membmer_Evenement 你想看到所有 4 个成员吗?
  • 是的,那样的话我想查看所有成员。

标签: sql sql-server sql-server-2005 sql-server-2008 sql-server-2008-r2


【解决方案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;

【讨论】:

  • 我明白了! EXCEPT 类似于关系模型中的 MINUS/difference 运算符!如果我想显示成员和事件的名称,我所要做的就是将结果传递给 from 语句并对其进行连接!
【解决方案2】:

要返回没有记录在 member_evenement 表中的所有 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 实际上是成员的 id,而不是样本数据中的名称。)

【讨论】:

  • 我会让马克从这里拿走。如果有人在为你钓鱼,我教你钓鱼是没有意义的。
【解决方案3】:

另一种可能性,它给出了与 Mark Ba​​nnister 和 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
  )

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 2020-10-07
    • 2019-11-10
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2020-03-26
    相关资源
    最近更新 更多