gpt4 book ai didi

sql - 有子查询 vs 只是加入表?

转载 作者:行者123 更新时间:2023-11-29 14:13:00 33 4
gpt4 key购买 nike

今天在处理一些 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

这两个例子之间有什么不同吗?

最佳答案

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

关于sql - 有子查询 vs 只是加入表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59057485/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com