为啥此 Select top 1 查询返回多个结果?

Posted

技术标签:

【中文标题】为啥此 Select top 1 查询返回多个结果?【英文标题】:Why does this Select top 1 query return more than one result?为什么此 Select top 1 查询返回多个结果? 【发布时间】:2015-02-28 01:38:13 【问题描述】:

我在下面有一个查询,它是更大查询的一部分。我打算根据 1.) 就业 ID 2.) 费率更改日期返回一个结果。 3.) 特殊规则(如果存在)。

SELECT TOP 1 rate

FROM Rate2
WHERE Rate2.entityno = 805181 
        AND Rate2.changedate <= [01/01/2011] 

        AND IIF(Rate2.SpecialRules = 'SpecialCase',
                Rate2.SpecialRules = 'SpecialCase',
                Rate2.SpecialRules = "NA")

ORDER BY Rate2.changedate DESC;

这是“Rate2”表的摘录

EntityNo|   ChangeDate| Rate|   SpecialRules
805181| Jan-01-2010|    178.00| NA
805181| Jul-28-2012|    185.00| NA
805181| Jan-01-2010|    204.00| 'SpecialCase'

在查询时,我返回 204 和 178 的费率。 我只想要“204”,如果我输入了“specialCase”,或者 178,如果我输入了“NA”。任何帮助将不胜感激。

谢谢,我正在使用 Access 2013。

【问题讨论】:

这可能会有所帮助 -- ***.com/questions/9339079/… -- 您需要建立另一个唯一字段以包含在您的 order by 子句中。 @sgeddes 感谢您的帮助 【参考方案1】:

如果您的 order by 设置为具有 MORE then 一个结果的值,则前 1 行因此具有多个满足此条件的(日期)值。

因此,前“1”值可能导致 200 行成为前 1 值。

因此,您有不止一个约会。如果您引入二阶值,则再次使用相同的规则,但现在基于两列。通过 ASC 排序,则只有一行具有最高值。如果您按 DESC 排序,那么显然不止一行(日期 + SpeicalRules)具有相同的值。

因此,更改顺序肯定会影响该数据集“第一”或前 1 的行数。

如果 speicalRules 具有重复值,并且日期也相同,则如前所述,使用 top 1 可以产生多于一行具有相同值的行。通过改变顺序,那么只有一个实际的数据行出现在顶部,没有重复值。

如果您不在乎,并且即使存在多个日期,也只需要/想要结果的第一行?然后只需将主键值添加到排序中。

例如:

ORDER BY Rate2.changedate DESC , Rate2.ID

这将导致逐行查询,即使许多日期相同,也只会返回一行。

上面将返回一组相同日期中的第一个。假设自动编号是递增的,那么可以通过像这样翻转 PK 的排序顺序来获得相同日期的最后一个最高日期:

ORDER BY Rate2.changedate DESC , Rate2.ID DESC

因此,某些内容的第一行基于您在 ORDER BY 子句中包含的列。如果该行重复,则前 1 将导致多于一行是前 1 的最高值。

将 PK 列添加到 ORDER by 从而确保所有行对于 TOP 1 子句都是唯一的。所以 TOP 1 只是由 order by 子句中包含的行驱动。

【讨论】:

【参考方案2】:

每 sgeddes

我已经修改为在 order by 子句中包含另一个唯一字段。

SELECT TOP 1 rate

FROM Rate2
WHERE Rate2.entityno = p.[test value 1] 
        AND Rate2.changedate <= [01/01/2011] 

        AND IIF(Rate2.SpecialRules = 'NewRule',
                Rate2.SpecialRules = 'NewRule',
                Rate2.SpecialRules = "NA")

ORDER BY Rate2.changedate DESC , rate2.SpecialRules ASC;

现在它可以工作了,但只有当 rate2.specialrules 是 ASC,而不是 DESC 时。谁能建议 ASC 和 DESC 如何影响文本记录?

【讨论】:

以上是关于为啥此 Select top 1 查询返回多个结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MySQL View 和同一个 View 的底层 SELECT 查询返回不同的结果?

无论是 EXISTS 还是 NOT EXISTS,SELECT 查询都会返回相同的结果——为啥?

为啥 SQL 查询的结果没有按我期望的顺序返回?

sql server和oracle中查询结果返回指定行数的语句

如何使用 SqlCommand 返回多个结果集?

为啥这个 sql 查询不能准确传递结果?