【问题标题】:Trying to Get SELECT TOP to work with Parameter in ACCESS尝试获取 SELECT TOP 以使用 ACCESS 中的参数
【发布时间】:2014-01-01 09:45:07
【问题描述】:

这是基于我前几天得到的一些代码(感谢彼得姆)。我现在正在尝试在查询计算后选择前 X 个结果。 X 的范围可以从 1 到 8,具体取决于每个玩家的结果数量。

这是我拥有的代码,但是当我尝试运行它时出现语法错误。

SELECT
  PlayerID
, RoundID
, PlayedTo
, (SELECT Count(PlayerID) FROM PlayedToCalcs) AS C
, iif(
    C <= 6
  , 1
  , iif(
      C <= 8
    , 2
    , (
        iif(
          C <= 10
        , 3
        , (
            iif(
              C <= 12
            , 4
            , (
                iif(
                  C <= 14
                , 5
                , (
                    iif(
                      C <= 16
                    , 6
                    , (
                        iif(
                          C <= 18
                        , 7
                        , (iif(C <= 20, 8, 999))
                        )
                      )
                    )
                  )
                )
              )
            )
          )
        )
      )
    )
  ) AS X
FROM PlayedToCalcs AS s
WHERE PlayedTo IN (
  SELECT TOP (X) PlayedTo
  FROM PlayedToCalcs
  WHERE PlayerID = s.PlayerID
  ORDER BY PlayedTo DESC, RoundID DESC
)
ORDER BY PlayerID, PlayedTo DESC, RoundID DESC;

这是一个链接http://sqlfiddle.com/#!3/a726c/4,其中包含我尝试使用它的数据的小样本。

【问题讨论】:

  • 我正在处理的数据库在 Access 2013 中
  • 当您删除 (x) 并将其替换为 SELECT TOP 10 ... 中所需的数字时会发生什么?或选择 TOP 10 PERCENT ...?
  • 就个人而言,每当我需要翻译的值超过一两个时,我都会指定一个表(作为临时表或通过 CTE)。这大大简化了查询,尤其是当您必须嵌套括号时...
  • 我可以建议使用switch 函数而不是iif 来处理多个条件。
  • 感谢 Yawar 的建议,它看起来可能是一个更好的解决方案,但我在尝试时似乎遇到了语法错误。这是链接sqlfiddle.com/#!3/a726c/41

标签: sql ms-access ms-access-2013


【解决方案1】:

Access db 引擎不允许您使用SELECT TOP 的参数。您必须在 SQL 语句中包含文字值。

例如,这个查询可以正常工作。

SELECT TOP 2 *
FROM tblFoo
ORDER BY id DESC;

但尝试替换参数 how_many 会触发错误 3141,“SELECT 语句包含拼写错误或缺少的保留字或参数名称,或者标点符号不正确。 "

SELECT TOP how_many *
FROM tblFoo
ORDER BY id DESC;

【讨论】:

    【解决方案2】:

    因为在 SQL Server(你在 SQL Fiddle 中使用的模拟器)中,你不能使用IIF。尝试使用CASE

    并且在 Access 中使用 7 个嵌套的IIF 是有限制的。

    【讨论】:

    • 谢谢你,我会试一试的。
    • 实际上,IIF() 确实在 SQL Server 2012 中工作,因此您可能需要指定它。
    • 如何更改代码以使其在 2012 年正常工作。您只需更改左上角的设置即可将 2008 年更改为 2012 年。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2017-07-19
    • 2011-04-30
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多