如何根据查询结果返回表中的随机记录?

Posted

技术标签:

【中文标题】如何根据查询结果返回表中的随机记录?【英文标题】:How to return random records in a table based on query results? 【发布时间】:2021-12-10 07:50:06 【问题描述】:

我有一个名为 Values 的表,其中包含数千条记录(样本要少得多)。数据本身是唯一的,只是一些记录共享相同的 ID。

所以我需要一个查询来根据 TestQ1 的总数返回随机记录。例如,该查询共有 9 条 ID 为 120 的记录,因此每次运行此查询时应该有 3 条随机记录,因为这是 Test 表所指示的(此表每周更改“Test”数字)。

如图:

“值”表是原始数据。 “TestQ1”查询具有该特定“ID”的总数 右边是应该返回的记录数。

这是我所能得到的:

SELECT TOP 5 Values.ID, Values.Test, Values.State, Rnd([Values]![ID]) AS [Random No], * FROM [Values] ORDER BY Rnd([Values]![ID]);

【问题讨论】:

您还需要一个唯一 ID。您可以通过将表值的记录附加到具有 Autonumber 字段设置为 Random 的表中来获得。 【参考方案1】:

TOP N 在查询对象中不能是动态的。

可以计算组序列 ID 并在条件中使用它来返回每个 ID 组的记录数。这需要一个可以提供自动编号的唯一标识符字段。将其设置为随机,以便在将记录添加到数据集时选择可以不同。

考虑 SQL:

SELECT Values.PKID, Values.ID, Values.Test, Values.State, DCount("*","Values","ID=" & [Values].[ID] & " AND PKID<" & [PKID])+1 AS GrpSeq
FROM TestQ2 INNER JOIN [Values] ON TestQ2.ID = Values.ID
WHERE (((DCount("*","Values","ID=" & [Values].[ID] & " AND PKID<" & [PKID])+1)<=[TestQ2].[Test]));

但是,如果您确实需要在每次查询运行时返回随机记录集,我预计将需要 VBA。使用每个 ID 组的随机序列号填充值表中的字段,或者使用随机数据集填充临时表。考虑使用 VBA 填充字段:

Sub RandomSeq()
Dim rs1 As DAO.Recordset, rs2 As DAO.Recordset, x As Integer
Set rs1 = CurrentDb.OpenRecordset("SELECT DISTINCT ID FROM [Values]")
Do While Not rs1.EOF
    Set rs2 = CurrentDb.OpenRecordset("SELECT * FROM [Values] WHERE ID=" & rs1!ID & " ORDER BY Rnd([ID]);")
    Do While Not rs2.EOF
        rs2.Edit
        x = x + 1
        rs2!GrpSeq = x
        rs2.Update
        rs2.MoveNext
    Loop
    rs2.Close
    x = 0
    rs1.MoveNext
Loop
End Sub

现在运行查询:

SELECT Values.ID, Values.Test, Values.State, Values.GrpSeq
FROM TestQ2 INNER JOIN [Values] ON TestQ2.ID = Values.ID
WHERE (((Values.GrpSeq)<=[TestQ2].[Test]));

请注意,这在具有多个同时用户的拆分数据库中是不切实际的。然后可能需要一个临时表(位于前端)方法。

【讨论】:

我有点过分了——我运行查询并得到:“指定的字段 'Values.PKID' 可以引用 SQL 语句的 FROM 子句中列出的多个表”。我有点迷茫 - 不知道为什么会返回该错误消息。 可能与查询中使用的 TestQ2 有关。这意味着 Values.PKID 字段将从两个来源中提取。我不知道 TestQ2 的 SQL,所以我使用表代替查询。为 TestQ2 中的 PKID 字段使用别名,以便在最终查询中与 Values 表中的字段名称不同。 其实,如果TestQ2查询中不包含PKID字段,应该不会出现这个错误,我不知所措。 是的,我被卡住了——不知道。我回去了,也不知道为什么会出现这个错误。 是的,需要在表中添加一个可以通过代码填充的字段。只是一个长整数类型。我使用 GrpSeq 作为名称。

以上是关于如何根据查询结果返回表中的随机记录?的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录

如何让此查询打印仅存在于一个表中的记录?

外连接查询

如何根据连接查询中的一列返回最大行? [复制]

Sql 查询为表中的每个组合返回一条记录

PHP运行查询关闭每个数组变量并返回表中的结果