2014-12-01 139 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 
相关问题