如何从 SQL 数据库表中选择随机行? [复制]

Posted

技术标签:

【中文标题】如何从 SQL 数据库表中选择随机行? [复制]【英文标题】:How to select a random row from a SQL database table? [duplicate] 【发布时间】:2021-05-11 19:30:13 【问题描述】:

我正在尝试从 Visual Studio 的数据库中检索表中的随机行。 但是,它无法检索随机行并引发此特定异常:

System.Data.SqlClient.SqlException: 'LIMIT' 附近的语法不正确。'

这是我检索随机表行的函数代码:

Voucher randomVoucher = null;
int voucherID;
string voucherName, voucherDescription, discountCode;
decimal discountAmount;

string queryStr = "SELECT * FROM Voucher ORDER BY RAND() LIMIT 1; ";

SqlConnection conn = new SqlConnection(_connStr);
SqlCommand cmd = new SqlCommand(queryStr, conn);

conn.Open();
SqlDataReader dr = cmd.ExecuteReader();

if (dr.Read())

    voucherID = int.Parse(dr["VoucherID"].ToString());
    voucherName = dr["VoucherName"].ToString();
    voucherDescription = dr["VoucherDescription"].ToString();
    discountAmount = decimal.Parse(dr["DiscountAmount"].ToString());
    discountCode = dr["DiscountCode"].ToString();

    randomVoucher = new Voucher(voucherID, voucherName, voucherDescription, discountAmount, discountCode);

else

    randomVoucher = null;


conn.Close();
dr.Close();
dr.Dispose();

return randomVoucher;

【问题讨论】:

什么是“Visual Studio 的数据库”?你是说 SQL Server Express 吗? SQL Server 不使用LIMIT,而是使用SELECT TOP 1 ...,语法不同。 RAND() 真的是 ORDER BY 的有效参数吗?我会考虑在两个查询中进行,一个计数,在 c# 中创建一个随机数,然后 getting that specific row. TOP 1 每次只返回第一行。 将查询改为SELECT TOP 1 * FROM Voucher ORDER BY NEWID() 【参考方案1】:

Limit 是一个mysql 语句,在Sql Server 中它的一个等价物可以使用OFFSETFETCH

string queryStr = "SELECT* FROM Voucher ORDER BY newid()  OFFSET 10 rows FETCH NEXT 10 ROWS ONLY;";

它从第 10 行开始读取随机排序的数据库的 10 行。

【讨论】:

阅读文档:返回一个从 0 到 1 的伪随机浮点值,独占。【参考方案2】:

您可以从 1 到您的表记录计数范围内获取随机数,然后从表中选择一个并获取结果!

伪代码:

// This is like a entity framework sample,
// You can get it from query by using SQL COUNT => SELECT COUNT(*) FROM $TABLE_NAME$;
tableRecordCount = table.Count();
//generating random number more then 0 and less then tableRecordCount
int randomNum = random.Next(1, tableRecordCount); 
//Then getting row with this id;
//Or with query => SELECT * FROM $TABLE_NAME$ WHERE id = randomNum ...
var randomRow = table.firstOrDefault(r => r.id == randomNum); 

因此,如果“id”是您的“主键”列并且值是唯一的,您将获得一条带有 id 的记录,即我们生成的随机数!祝你好运!

【讨论】:

虽然这可行,但它需要对数据库进行两次查询或将整个表下载到内存中 这个好像行得通,只需要检查随机ID是否真的存在于数据库中并且没有被删除,如果没有再次选择随机ID。

以上是关于如何从 SQL 数据库表中选择随机行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

sql 从sqlite表中选择随机行

从Hive表中选择每列的随机行数

如何在 Postgres 中从具有非均匀分布的表中选择随机行?

从 sqlite 表中选择随机行

尝试使用 selenium/jquery 从表中选择随机行

从具有加权行概率的 PostgreSQL 表中选择随机行