我最近编写了一个包含此部分的存储过程
select T.Id from Teams T
inner join
(
select SG.Team1Id, SG.Team2Id from SG
union all
select SP.Team1Id, SP.Team2Id from SP
) G
on T.Id in (G.Team1Id, G.Team2Id)
我怀疑这个查询效率
此查询是否会从子查询中的SG
和SP
获取所有记录,然后将应用连接条件?如果是,那么我认为这不是有效的
或
Sql server是否足够聪明,只能从符合连接条件的两个表中获取行?
答案 0 :(得分:2)
派生表格中的UNION ALL
可能更多高效
SELECT T.Id
FROM Teams T
INNER JOIN SG
ON T.Id IN ( SG.Team1Id, SG.Team2Id )
UNION ALL
SELECT T.Id
FROM Teams T
INNER JOIN SP
ON T.Id IN ( SP.Team1Id, SP.Team2Id )
因为您问题中的版本只需要通过Teams
。如果表SP
和SG
具有约束,Team1Id
不能与Team2Id
相同,并且各列被编入索引,则以下内容可能会更好(对于某些数据分布) ,特别是如果Teams
与其他相关表格相比相对较大,那么
SELECT T.Id
FROM Teams T
INNER JOIN (SELECT SG.Team1Id
FROM SG
UNION ALL
SELECT SG.Team2Id
FROM SG
UNION ALL
SELECT SP.Team1Id
FROM SP
UNION ALL
SELECT SP.Team2Id
FROM SP) G(TeamId)
ON T.Id = G.TeamId