有子查询还是加入 table?

Having with sub-query vs just joining onto table?

今天在处理一些 SQL 时,我遇到了一个使用 HAVING 和子查询的查询。我发现它有点奇怪,因为子查询中的 table 只包含一列值,我认为加入 table.

会更简单

请注意 [F Types] table 是一列唯一值。

我发现的示例:

SELECT ST.COL1, ST.COL2, ST.COL3
FROM SOME_TABLE ST
HAVING ST.TYPE In (Select [Type] from [F Types]);

我在想这会做同样的事情,而且可能会更好:

SELECT ST.COL1, ST.COL2, ST.COL3
FROM SOME_TABLE ST
JOIN [F Types] FT
    ON ST.TYPE = FT.Types

我只是想确保我没有遗漏任何东西,因为我不明白为什么有人会在这里使用 HAVING

这两个例子之间有什么区别吗?

两种方法都行,我认为从技术上讲连接速度更快

大多数情况下,当您确实想要连接其他 table 中存在的其他列数据时,会使用连接

同时,子查询用作某些table的查找参考来引用数据,仅供参考

除了上述差异之外,想象一下如果有大量记录需要花费很多时间,而仅通过子查询进行引用在执行连接时成本会更高,那么 Join 的成本仍然很高。

您会使用 WHERE,而不是 HAVINGHAVING 用于聚合查询。所以你的问题是:

SELECT ST.COL1, ST.COL2, ST.COL3
FROM SOME_TABLE ST
WHERE ST.TYPE In (SELECT f.[Type] FROM [F Types] f);

这通常优于 JOIN 查询。您不必担心 [F Types] 中的重复项会导致结果集中出现重复行。

SELECT ST.COL1, ST.COL2, ST.COL3
FROM SOME_TABLE ST
WHERE EXISTS (SELECT 1 FROM [F Types] f WHERE f.[Type] = ST.TYPE);

这很容易利用 [F Types]([Type]) 上的索引,并且通常是最快的方法(尽管这三种方法应该具有可比性)。

说了这么多,JOIN没有错。只是在某些情况下,它会产生不需要的重复项。

通常,这是使用 EXISTS 而不是 IN 编写的: