有沒有更有效的方法來寫這篇文章?我不確定這是實現這一點的最佳方式。競品結果或搜索結果
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) –