2016-09-28 146 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,但在查詢執行期間它是不同的。它可以作爲桌面功能,可以在你的情況下更好地預製。