假设我有以下T-SQL代码:
SELECT * FROM Foo f
INNER JOIN Bar b ON b.BarId = f.BarId;
WHERE b.IsApproved = 1;
Run Code Online (Sandbox Code Playgroud)
以下一行也返回相同的行集:
SELECT * FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
Run Code Online (Sandbox Code Playgroud)
这可能不是这里最好的案例样本,但这两者之间是否有任何性能差异?
我遇到了一个非常令人困惑的情况,这使我质疑我对SQL Server中的连接的理解.
SELECT t1.f2
FROM t1
LEFT JOIN t2
ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
Run Code Online (Sandbox Code Playgroud)
不会给出相同的结果:
SELECT t1.f2
FROM t1
LEFT JOIN t2
ON t1.f1 = t2.f1 AND cond2
WHERE t2.f3 > something
Run Code Online (Sandbox Code Playgroud)
可以通过告诉这两个查询是否应该是等价的来取悦某人的帮助吗?
谢谢
SQL1:
select t1.f1,t2.f2
from t1
left join t2 on t1.f1 = t2.f2 and t1.f2=1 and t1.f3=0
Run Code Online (Sandbox Code Playgroud)
SQL2:
select t1.f1,t2.f2
from t1
left join t2 on t1.f1 = t2.f2
where t1.f2=1 and t1.f3=0
Run Code Online (Sandbox Code Playgroud)
不同之处在于where和on子句,是否有相同的返回结果?有什么区别?DBMS以同样的方式运行它们吗?谢谢.
我有一个查询,其中我使用13 LEFT OUTER JOINS.左边的表有一个大数据,因此执行查询并返回结果需要很长时间.但是当我使用where子句来过滤结果时,它只需要很少的时间.现在我很困惑哪个先执行:产生结果的连接然后where子句从中过滤或者首先过滤结果,得到结果的连接.
我通常不会在执行 a 时AND在同一行中使用 an ,因为我过去遇到过问题。我宁愿不进入这个泡菜,而是将任何附加条件放在一个可靠的子句中。但是今天,出于好奇,我很想提出这个问题并一劳永逸地澄清。ONLEFT JOINWHERE
问题:LEFT JOIN当我使用“exta”条件时,到底发生了什么?为什么它的行为方式与WHERE?
示例查询
create table #a
(
id int,
name varchar(3)
)
create table #b
(
id int,
name varchar(3)
)
insert into #a
select 1, 'abc'
union
select 2, 'def'
union
select 3, 'ghi'
insert into #b
select 1, 'abc'
union
select 2, 'def'
select * from #a a left join #b b on a.id = b.id
where a.id = 3
select * …Run Code Online (Sandbox Code Playgroud)