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