gpt4 book ai didi

sql - 使用 JOIN 时的 WHERE 子句与 ON

转载 作者:行者123 更新时间:2023-12-01 18:25:17 25 4
gpt4 key购买 nike

假设我有以下 T-SQL 代码:

SELECT * FROM Foo f
INNER JOIN Bar b ON b.BarId = f.BarId;
WHERE b.IsApproved = 1;

以下代码也返回同一组行:

SELECT * FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);

这可能不是最好的案例示例,但这两者之间有性能差异吗?

最佳答案

请注意与外连接的区别。将 b.IsApproved 过滤器(右表中的 Bar)添加到 JOINON 条件的查询:

SELECT * 
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);

与将过滤器放在 WHERE 子句中相同吗:

SELECT * 
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1);

由于与 Bar 的“失败”外连接(即 f.BarId 没有 b.BarId),因此对于所有此类失败的连接行,会将 b.IsApproved 保留为 NULL,然后这些行将被过滤掉。

另一种看待这个问题的方法是,对于第一个查询,LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId) 将始终返回LEFT 表行,因为 LEFT OUTER JOIN 保证即使连接失败也会返回 LEFT 表行。但是,根据条件将 (b.IsApproved = 1) 添加到 LEFT OUTER JOIN 的效果是,当 (b.IsApproved = 1) 为 false,即按照通常应用于 (b.BarId = f.BarId) 上的 LEFT JOIN 条件的相同规则。

更新:为了完成 Conrad 提出的问题,可选过滤器的等效 LOJ 为:

SELECT * 
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);

WHERE 子句需要考虑连接是否失败(NULL)并且忽略过滤器的条件,以及连接成功并且必须应用过滤器的条件。 (b.IsApprovedb.BarId 可以测试 NULL)

我已经输入了SqlFiddle together here它演示了 b.IsApproved 过滤器相对于 JOIN 的不同位置之间的差异。

关于sql - 使用 JOIN 时的 WHERE 子句与 ON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10297231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com