Access中用SQL随机选择一行

Posted

技术标签:

【中文标题】Access中用SQL随机选择一行【英文标题】:Randomly Select a Row with SQL in Access 【发布时间】: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()。同样的错误。

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

【问题讨论】:

"小型访问数据库" ?请相应地标记您的问题 如果您使用 MS-Access,请参阅:***.com/questions/9937222/… 【参考方案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。

以上是关于Access中用SQL随机选择一行的主要内容,如果未能解决你的问题,请参考以下文章

ACCESS中用SQL语句新增一列

使用联合从 MS Access 表中选择随机记录 [重复]

MS Access 选择不同的随机值

MS Access - 根据百分比随机选择记录

需要帮助返回 ms-access 测试库的随机顺序多项选择答案

使用 SQL 在 Access 中选择特定值