Begleiten Sie mit Or Zustand

Gibt es eine effizientere Möglichkeit, dies zu schreiben? Ich bin nicht sicher, dass dies der beste path ist, dies zu implementieren.

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

ODER in JOINS ist eine schlechte Praxis, denn MSSQL kann keine Indizes in ritgh Weise verwenden. Besserer path – Verwenden Sie zwei Wahlen mit 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 

Dinge, die bei der Verwendung von LEFT JOIN in der Abfrage zu beachten sind:

1) Zuerst kann linke Verknüpfung NULL (s) einführen, die ein performancesproblem sein kann, da NULL (s) separat von server-Engine behandelt werden.

2) Die Tabelle, die als null-fähig verbunden ist, sollte nicht sperrig sein, sonst wird es kostspielig sein, um (performance + Ressource) auszuführen.

3) Versuchen Sie, Spalte (n) einzuschließen, die bereits indiziert wurde. Andernfalls, wenn Sie diese Spalte (s) als besser insert müssen, build Sie einige Index (es) für sie.

In deinem Fall hast du zwei Spalten aus der gleichen Tabelle, um mit einer anderen Tabelle verbunden zu sein. Also, in diesem Fall wäre ein guter Ansatz wäre, wenn Sie eine einzelne Tabelle mit der gleichen Spalte der erforderlichen data haben können, wie ich unten gezeigt habe:

 ; 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 

Ich habe OUTER APPLY verwendet, die fast ähnlich wie LEFT OUTER JOIN ist, aber es ist anders während der Abfrageausführung. Es funktioniert als Table-Valued-function, die sich in Ihrem Fall besser vorbereiten kann.