为啥此 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 查询都会返回相同的结果——为啥?