拥有子查询与仅加入表有关吗?

时间:2019-11-26 18:41:18

标签: sql postgresql join having

今天使用某些SQL时,我遇到了一个查询,该查询将HAVING与子查询一起使用。我发现这有点奇怪,因为子查询中的表仅包含一列值,我认为将表连接起来会更简单。

请注意[F Types]表是唯一值的单列。

我发现的例子

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

两个示例之间的区别是什么?

3 个答案:

答案 0 :(得分:1)

这两种方法都可行,我认为联接在技术上更快

答案 1 :(得分:1)

通常,当您实际上希望将另一个表中存在的其他列数据进行联接时,将使用联接

同时,子查询被用作某些表的查找参考,以引用仅用于参考的数据

增加上述差异的原因是连接仍然是昂贵的想象,因为有大量记录集需要很多时间,而仅通过子查询进行引用会在执行连接时花费更大。

答案 2 :(得分:1)

您将使用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编写的: