Sql 为子表的匹配父表选择所有子表ID

Sql 为子表的匹配父表选择所有子表ID,sql,sql-server-2012,Sql,Sql Server 2012,我下面有这些桌子。。(为了便于阅读,我省略了其他不必要的列) 团队-团队ID、团队名称 团队成员-团队成员ID、团队ID、成员名称 BoothVisitLog-BoothVisitLogID,BoothID,访问者(MemberID) 例如,假设ID为1的团队成员访问BoothID 1。现在我想知道同一团队中是否有人参观过展位 我已经写了下面的查询,运行良好。但我更倾向于编写更好的优化查询,而不是使用子查询。我有没有办法用join来达到同样的效果 SELECT * FROM BoothVisit

我下面有这些桌子。。(为了便于阅读,我省略了其他不必要的列)

团队-团队ID、团队名称

团队成员-团队成员ID、团队ID、成员名称

BoothVisitLog-BoothVisitLogID,BoothID,访问者(MemberID)

例如,假设ID为1的团队成员访问BoothID 1。现在我想知道同一团队中是否有人参观过展位

我已经写了下面的查询,运行良好。但我更倾向于编写更好的优化查询,而不是使用子查询。我有没有办法用join来达到同样的效果

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

由于展位id为
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表上的
自连接
获得结果

 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