【问题标题】:How to select a random row from a SQL database table? [duplicate]如何从 SQL 数据库表中选择随机行? [复制]
【发布时间】: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()

标签: c# sql sql-server


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多