有子查询还是加入 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
,而不是 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
编写的:
今天在处理一些 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
,而不是 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
编写的: