【问题标题】:Randomly Select a Row with SQL in AccessAccess中用SQL随机选择一行
【发布时间】:2013-11-08 21:39:51
【问题描述】:

我有一个带有一些表的小型访问数据库。我正在尝试访问中的 sql 设计中的代码。我只想在表中随机选择一条记录。

我创建了一个名为StateAbbreviation 的简单表。它有两列:IDAbbreviationID 只是一个自动编号,Abbreviation 是状态的不同缩写。

我在这里看到this 线程。所以我尝试了

SELECT Abbreviation
FROM STATEABBREVIATION
ORDER BY RAND()
LIMIT 1;

我在查询表达式RAND() LIMIT 1 中收到错误语法错误(缺少运算符)。所以我厌倦了RANDOM() 而不是RAND()。同样的错误。

其他人也没有工作。我究竟做错了什么?谢谢。

【问题讨论】:

标签: sql ms-access


【解决方案1】:

Ypercude 提供了一个链接,让我找到了下面的正确答案:

SELECT TOP 1 ABBREVIATION
FROM STATEABBREVIATION 
ORDER BY RND(ID);

请注意,对于 RND(),我认为它必须是整数值/变量。

【讨论】:

  • 请注意,提供整数主键值作为参数 (RND(ID)) 很重要,这样 Access SQL 将为每条记录生成不同的随机值。 (如果您只是使用ORDER BY RND(),那么查询优化器会认为函数调用是确定性的,并且只对其进行一次评估。因此,您会为所有行获得相同的“随机”值。)
【解决方案2】:

您需要一个 变量 和一个 时间种子 以便在每次打开 Access 并运行查询时都不会获得相同的序列 - 并使用 Access中的SQL

SELECT TOP 1 Abbreviation
FROM STATEABBREVIATION
ORDER BY Rnd(-Timer()*[ID]);

其中 ID 是表的主键。

【讨论】:

    【解决方案3】:

    请试试这个,对你有帮助

    可以通过使用存储过程和函数,我创建它有一个额外的列,你可以在你的表中创建 FLAG 名称和列的所有字段值都应该是 0 然后它可以工作

    create Procedure proc_randomprimarykeynumber
    as
        declare @Primarykeyid int  
    
        select top 1  
            @Primarykeyid = u.ID 
        from 
            StateAbbreviation u  
        left join  
            StateAbbreviation v on u.ID = v.ID + 1 
        where 
            v.flag = 1 
    
        if(@Primarykeyid is null )
        begin
            UPDATE StateAbbreviation 
            SET flag = 0  
    
            UPDATE StateAbbreviation 
            SET flag = 1 
            WHERE ID IN (SELECT TOP 1 ID 
                         FROM dbo.StateAbbreviation)
        END
        ELSE
        BEGIN
            UPDATE StateAbbreviation 
            SET flag = 0 
    
            UPDATE StateAbbreviation 
            SET flag = 1 
            WHERE ID IN (@Primarykeyid)
        END 
    
        SET @Primarykeyid = 1 
    
        SELECT TOP 1 
            ID, Abbreviation 
        FROM
            StateAbbreviation 
        WHERE
            flag = 1
    

    在存储过程中运行它并获取串行主键

    exec proc_randomprimarykeynumber
    

    感谢和尊重

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT TOP 1 *
      FROM tbl_name
      ORDER BY NEWID()
      

      当然,这可能对大型表有性能考虑。

      【讨论】:

      • 在任何情况下都会在Access SQL下有“性能考虑”,特别是“表达式中的未定义函数'NEWID'。”
      • 糟糕 - 我没有注意到 OP 中的“访问”一词 - 我只是假设 SQL Server。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多