我搜索过但没有找到明确的答案。其中哪一个更适合SQL Server的性能:
SELECT T.*
FROM dbo.Table1 T
LEFT JOIN Table2 T2 ON T.ID = T2.Table1ID
LEFT JOIN Table3 T3 ON T.ID = T3.Table1ID
WHERE T2.Table1ID IS NOT NULL
OR T3.Table1ID IS NOT NULL
...或
SELECT T.*
FROM dbo.Table1 T
JOIN Table2 T2 ON T.ID = T2.Table1ID
UNION
SELECT T.*
FROM dbo.Table1 T
JOIN Table3 T3 ON T.ID = T3.Table1ID
我尝试过两者都跑,但很难确定。我很欣赏为什么一个比另一个更快,或者它取决于具体情况的解释。
答案 0 :(得分:4)
您的两个查询不会执行相同的操作。特别是,如果值在任一表中重复,则第一个将返回重复的行。
如果您要查找Table1
中其他两个表中任意一行的行,我建议使用exists
:
select t1.*
from Table1 t1
where exists (select 1 from Table2 t2 where t2.Table1Id = t1.id) or
exists (select 1 from Table3 t3 where t3.Table1Id = t1.id);
并在Table1Id
和Table2
中的Table3
上创建索引。
您的哪些原始查询更快取决于数据。第二步有一个额外的步骤来删除重复(union
经文union all
)。另一方面,第一个可能最终会创建许多重复的行。