为什么选择前1个查询会返回多个结果?

时间:2015-02-28 01:38:13

标签: sql ms-access

我在下面有一个查询,它是更大查询的一部分。我打算根据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.

2 个答案:

答案 0 :(得分:2)

如果您的订单设置为包含多个结果的值,那么前1行将具有符合此条件的多个(日期)值。

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

因此,您有超过一个最佳日期。如果您引入了第二个订单值,那么再次使用相同的规则,但现在基于两列。通过ASC排序,只有一行具有最高值。如果您通过DESC订购,那么显然有一行(date + SpeicalRules)存在且具有相同的值。

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

如果speicalRules具有重复值,并且具有相同的日期,那么使用top 1可以生成多个具有相同值的行。通过更改顺序,只有一个实际的数据行显示在顶部而不重复值。

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

例如:

ORDER BY Rate2.changedate DESC , Rate2.ID

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

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

ORDER BY Rate2.changedate DESC , Rate2.ID DESC

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

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

答案 1 :(得分:0)

per 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如何影响文本记录?