在 SQL Server 效率方面有什么更好的;使用子查询或连接?
我知道不相关的比相关的子查询更好。但是加入呢?
使用连接使 SQL 变得更具可读性和可理解性
OUTER JOIN and check for NULLS
但它对数据库的性能来说是更糟还是更好?
在 SQL Server 效率方面有什么更好的;使用子查询或连接?
我知道不相关的比相关的子查询更好。但是加入呢?
使用连接使 SQL 变得更具可读性和可理解性
OUTER JOIN and check for NULLS
但它对数据库的性能来说是更糟还是更好?
以您的示例为例,如果 c2 是 c1 的子级(也就是 c2 中每行 c1 中的许多行),这些通常是不同的查询。这是通常的情况,除非你只有 1:1 的关系。
要使它们相同,您需要在第一个上使用 DISTINCT:这不会使其更具可读性。
更进一步,第二个可以表示为
即:IN、EXISTS 和 INTERSECT 给出相同的结果。
现在,既然您询问了 LEFT JOIN,我们也可以涵盖相反的情况。这里我们没有 NOT IN,NOT EXISTS,LEFT JOIN 和 EXCEPT。
假设我们想要 t1 中的行,而 t2 中没有行,其中 t2.c3 = 'foo'
在这种情况下,只有 EXCEPT 和 NOT EXISTS总是正确的。NOT IN 将在 t2.c2 永远为 NULL 时失败。并且您需要在 LEFT JOIN 中使用 DISTINCT。
另请注意,LEFT JOIN 过滤器位于 ON 子句中。要删除它,您需要派生表或 CTE。
我还要说的是,鉴于查询优化器的复杂性(当然除非被滥用),这些天的子查询并不重要
就个人而言,我几乎总是使用 EXISTS 和 NOT EXISTS(为了清楚起见,可能使用 INTERSECT 或 EXCEPT),因此我的代码是一致的并且适用于所有情况。我不必担心将 LEFT JOIN 混入 INNER JOIN 或 NOT IN 中的 NULL。
如果使用连接使 SQL 更具可读性和可理解性,那么请使用连接,除非您有充分的理由不这样做。同样,如果使用子查询使 SQL 更具可读性和可理解性,请使用子查询,除非您有充分的理由不这样做。使用一种结构或另一种结构可以更轻松地表达不同的查询,这并不是一种适合所有情况的方法。
如果您发现可读性更高的选项不够有效,我只会考虑使用可读性较差的选项。与大多数关系数据库一样,SQL Server 可以频繁地将使用子查询的语句转换为使用连接的语句。所以查询计划通常没有区别。
我更喜欢使用 JOIN 而不是子查询,尤其是对于简单的查询,但是一旦查询的复杂性达到一定程度,我通常会将其分解并使用子查询。
简单的 JOIN 很容易创建,特别是如果您可以访问数据库的模式。子查询也可以很简单,但相当冗长,并且更容易查看子查询并将其分解以分析其执行的内容。