加入或条件

时间:2016-09-28 04:32:23

标签: sql-server tsql

有没有更有效的方法来写这个?我不确定这是实现此目的的最佳方式。

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

3 个答案:

答案 0 :(得分:3)

JOINS中的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

答案 1 :(得分:0)

在查询中使用LEFT JOIN时需要注意的事项:

1)首先,左连接可能会引入可能是性能问题的NULL,因为服务器引擎会单独处理NULL。

2)作为null-able加入的表不应该太大,否则执行成本会很高(性能+资源)。

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类似,但在查询执行期间它是不同的。它可以作为表值函数,在您的情况下可以更好地执行。

答案 2 :(得分:0)

我的答案不是重点,但是我发现这个问题是在寻找内部连接的“或”条件,因此对于下一个寻求者可能很有用 对于内部联接,我们可以使用传统语法:

select * 
from stat.UniqueTeams uTeam, stat.Matches match 
where  match.AwayTeam = uTeam.Id or match.HomeTeam = uTeam.id

注意-此查询的性能较差(首先交叉连接,然后过滤)。但它可以在很多条件下工作,并且适合脏数据研究(例如t1.id = t2.id或t1.name = t2.name)