2014-12-01 102 views
1

我有下面這些表的匹配的父..(我省略了可讀性其他不必要的列)選擇所有子表ID爲孩子

隊 - TeamID,TeamName

TeamMembers - TeamMemberID,TeamID ,成員名稱

BoothVisitLog - BoothVisitLogID,BoothID,訪問了(MEMBERID)

對於例如假設ID爲1的團隊成員訪問了BoothID 1.現在我想查看是否有任何同一團隊的成員訪問了該展位。

我寫了下面的查詢哪些工作正常。但我更傾向於編寫更好的優化查詢,而不是使用子查詢。有什麼方法可以使用連接實現相同?

SELECT * FROM BoothVisitLog BVL INNER JOIN 
(
    SELECT TM.MemberID FROM TeamMembers TM 
    INNER JOIN Teams T ON TM.TeamID = T.TeamID 
    WHERE T.TeamID IN 
    (
     SELECT TM.MemberID FROM TeamMembers TM 
     INNER JOIN Teams T ON TM.TeamID = T.TeamID 
     WHERE TM.MemberID = 1 
    ) 
) TTM ON BVL.VisitedBy = TTM.MemberID AND BVL.BoothID = 1 

回答

1

由於展位編號爲1,只有重要的是會員ID的團隊1

這會給你想要

SELECT BL.* FROM BoothVisitLog BL 
JOIN TeamMembers TM 
ON BL.BoothID =1 
AND TM.MemberID = BL.VisitedBy 
JOIN 
(select TeamID from TeamMembers where MemberID =1) T 
ON T.TeamID = TM.TeamID 

在情況下的結果,你想知道結果對於會員ID爲1的團隊成員也可以看到的所有展位,您可以在BoothVisitLog表格上使用self join獲得結果。

SELECT BL2.* FROM BoothVisitLog BL1 
JOIN BoothVisitLog BL2 
on BL1.BoothID = BL2.BoothID 
AND BL1.VisitedBy =1 
JOIN TeamMembers TM 
on TM.MemberID = BL2.VisitedBy 
JOIN 
(select TeamID 
    from TeamMembers where MemberID =1) T 
ON T.TeamID = TM.TeamID