Access中用SQL随机选择一行
Posted
技术标签:
【中文标题】Access中用SQL随机选择一行【英文标题】:Randomly Select a Row with SQL in Access 【发布时间】:2013-11-08 21:39:51 【问题描述】:我有一个带有一些表的小型访问数据库。我正在尝试访问中的 sql 设计中的代码。我只想在表中随机选择一条记录。
我创建了一个名为StateAbbreviation
的简单表。它有两列:ID
和 Abbreviation
。 ID
只是一个自动编号,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随机选择一行的主要内容,如果未能解决你的问题,请参考以下文章