如何从 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
中它的一个等价物可以使用OFFSET
和FETCH
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 数据库表中选择随机行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章