2016-09-28 145 views
1

有没有更有效的方法来写这篇文章?我不确定这是实现这一点的最佳方式。竞品结果或搜索结果

select * 
from stat.UniqueTeams uTeam 
Left Join stat.Matches match 
on match.AwayTeam = uTeam.Id or match.HomeTeam = uTeam.id 
+0

您是否在查询中运行了'EXPLAIN'来查看SQL Server实际在做什么?我认为它有可能只用一个'OR'条件来使用索引。 –

+0

你应该拍拍你的背部。哦,对不起我的意思是.. 你应该得到一个upvote在后面 – toha

+0

uTeam.Id IN(match.AwayTeam,match.HomeTeam) –

回答

3

或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 
+0

太酷了,先生。我会注意到这个 – toha

+0

@toha你能标记我的答案是正确的,还是我需要添加一些东西? – Backs

+0

我不是TS ..我不能接受回答其他用户的问题 – toha

0

观光,同时使用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,但在查询执行期间它是不同的。它可以作为桌面功能,可以在你的情况下更好地预制。