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;