Sql 下表的结果是否有差异?

Sql 下表的结果是否有差异?,sql,coding-style,Sql,Coding Style,基本信息: 两者之间有什么区别吗 SELECT code, power, MIN(coins_needed) AS coins_needed FROM Wands GROUP BY code, power 及 为什么我们需要连接原始表本身以获得正确的结果? 我尝试使用Product table from,它返回相同的结果,只是数据顺序不同。显然,这两个查询看起来不同,可能会生成不同的执行计划。查询也不同 最重要的区别是,第一个查询为数据库中code和power的每个唯一组合返回一行 如果有两行

基本信息:

两者之间有什么区别吗

SELECT code, power, MIN(coins_needed) AS coins_needed
FROM Wands
GROUP BY code, power

为什么我们需要连接原始表本身以获得正确的结果? 我尝试使用Product table from,它返回相同的结果,只是数据顺序不同。

显然,这两个查询看起来不同,可能会生成不同的执行计划。查询也不同

最重要的区别是,第一个查询为数据库中
code
power
的每个唯一组合返回一行

如果有两行具有相同的最小值,则第二个查询将返回重复项。换句话说,它返回原始数据中的所有行,这些行对于每个
code
/
power
组合具有最小数量的硬币

一个更微妙的区别是如何处理
NULL
值。第一个查询返回
code
power
NULL
值。第二个过滤掉
NULL

如果
code
power
没有
NULL
值,并且
coins\u needed
在具有相同
code
power
的行上是唯一的,则这两个查询应返回相同的结果。然而,这些都是很大的假设,查询也不是等价的

请注意,窗口函数是编写第二个查询的更简单方法:

SELECT code, power, coins_needed
FROM (SELECT w.*,
             RANK() OVER (PARTITION BY code, power ORDER BY coins_needed) as seqnum
      FROM Wands w
     ) w
WHERE seqnum = 1;

好吧,这不是100%等价的,因为它包括
code
power

NULL
值。在这种情况下,认为您不需要加入原始表,第一次查询就足够了。在其他情况下会有所不同吗?如果您想从需要最少硬币的魔杖中选择所有行。您可以找到所需的最小值和与原始表的自联接(联接中没有代码)。这两个查询是不同的
min
将返回每个组上具有最小值的一行,通过在此返回到同一个表,您将获得共享该值的所有行(如果不止一行)。你做什么取决于你想要什么。
SELECT code, power, coins_needed
FROM (SELECT w.*,
             RANK() OVER (PARTITION BY code, power ORDER BY coins_needed) as seqnum
      FROM Wands w
     ) w
WHERE seqnum = 1;