有没有更有效的方法来写这篇文章?我不确定这是实现这一点的最佳方式。竞品结果或搜索结果
select *
from stat.UniqueTeams uTeam
Left Join stat.Matches match
on match.AwayTeam = uTeam.Id or match.HomeTeam = uTeam.id
有没有更有效的方法来写这篇文章?我不确定这是实现这一点的最佳方式。竞品结果或搜索结果
select *
from stat.UniqueTeams uTeam
Left Join stat.Matches match
on match.AwayTeam = uTeam.Id or match.HomeTeam = uTeam.id
或JOIN中的OR是不好的做法,因为MSSQL不能以ritgh的方式使用索引。 更好的办法 - 使用两个选择与UNION:
SELECT *
FROM stat.UniqueTeams uTeam
LEFT JOIN stat.Matches match
ON match.AwayTeam = uTeam.Id
UNION
SELECT *
FROM stat.UniqueTeams uTeam
LEFT JOIN stat.Matches match
ON match.HomeTeam = uTeam.id
观光,同时使用LEFT注意JOIN查询:
1)首先,左连接可以引入NULL(S),可以是一个性能问题,因为NULL(s)被服务器引擎单独处理。
2)作为无效连接的表不应该是庞大的,否则执行成本会很高(性能+资源)。
3)尝试包括已经编制索引的列。否则,如果您需要首先包含这样的列,那么您可以为它们构建一些索引。
在你的情况下,你有两列从同一个表中左侧连接到另一个表。所以,在这种情况下,一个好的办法是,如果你能有所需数据的同一列一个表,我已经如下图所示:
; WITH Match AS
(
-- Select all required columns and alise the key column(s) as shown below
SELECT match1.*, match1.AwayTeam AS TeamId FROM stat.Matches match1
UNION
SELECT match2.*, match2.HomeTeam AS TeamId FROM stat.Matches match2
)
SELECT
*
FROM
stat.UniqueTeams uTeam
OUTER APPLY Match WHERE Match.TeamId = uTeam.Id
我已经使用OUTER APPLY这几乎是类似于LEFT OUTER JOIN,但在查询执行期间它是不同的。它可以作为桌面功能,可以在你的情况下更好地预制。
您是否在查询中运行了'EXPLAIN'来查看SQL Server实际在做什么?我认为它有可能只用一个'OR'条件来使用索引。 –
你应该拍拍你的背部。哦,对不起我的意思是.. 你应该得到一个upvote在后面 – toha
uTeam.Id IN(match.AwayTeam,match.HomeTeam) –