今天使用某些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
。
两个示例之间的区别是什么?
答案 0 :(得分:1)
这两种方法都可行,我认为联接在技术上更快
答案 1 :(得分:1)
通常,当您实际上希望将另一个表中存在的其他列数据进行联接时,将使用联接
同时,子查询被用作某些表的查找参考,以引用仅用于参考的数据
增加上述差异的原因是连接仍然是昂贵的想象,因为有大量记录集需要很多时间,而仅通过子查询进行引用会在执行连接时花费更大。
答案 2 :(得分:1)
您将使用WHERE
,而不是HAVING
。 HAVING
用于聚合查询。所以你的问题是关于:
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
编写的: