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 
)