【问题标题】:Randomly Selecting Multiple Records随机选择多条记录
【发布时间】:2019-12-07 04:43:10
【问题描述】:

我有一张同时包含男性和女性性别(PK (Id)、PersonsName、IsMale)的表格。我希望得到一个随机的名字,但对于两种性别。示例:

Select Top 1 PersonsName 
From MyTable 
Where IsMale = '1' 
Order by NewID()

Select Top 1 PersonsName 
From MyTable 
Where IsMale = '0' 
Order by NewID()

如何组合这些语句,以便从一条 SQL 语句返回 2 条记录(1 条男性和 1 条女性名称)?

我过去在这里看到有人只是在同一个 SQL 查询中将两条语句分开,如下所示:

Select Top 1 PersonsName 
From MyTable 
Where IsMale = '1' 
Order by NewID();

Select Top 1 PersonsName 
From MyTable 
Where IsMale = '0' 
Order by NewID()

每次运行代码时,我希望有两个完全随机的名称,而不是两个相同性别的记录,这样我就可以填充数据集并将其绑定到 ListView 控件。我只需要SQL语句

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您要查找的是UNION 关键字

select PersonsName from (Select TOP 1 PersonsName From MyTable Where IsMale = '1' Order by NewID()) a
UNION ALL
Select PersonsName from (Select TOP 1 PersonsName From MyTable Where IsMale = '0' Order by NewID()) b

这将返回 1 个包含 2 行的结果集。

【讨论】:

  • 这失败了,即使我输入 SQL Management Studio,它也会在 Union 附近显示不正确的语法,而其他人说您只能通过语句获得一个订单。这里的另一个问题然后说嵌入如下语句: select * from (select top 1 ... order by newid()) as T Union select * from (select top 1... order by newid()) as T order by PersonsName ASC 似乎有效
  • @MyNameHere 语法已修复,只需将 orderby 放在子查询中,您可能希望使用 UNION ALL 而不是 UNION ,就像您找到的其他示例一样。如果您不使用 ALL,如果您随机选择一个既是男孩名又是女孩名的名字,则可能会返回 1 行。如果您没有 ALL,它会对结果执行 DISTINCT。
  • 谢谢你,斯科特,这是一个很好的提示!
【解决方案2】:

您还可以使用 Row_Number() 和 WITH TIES 子句。这将返回一个。

Select Top 1 with Ties *
 From  YourTable
 Order By Row_Number() over (Partition By IsMale Order by NewID())

在旁注中。前 4 名将各给你两个

【讨论】:

    【解决方案3】:

    使用 union 关键字来避免相同的重复记录。 Union 是一个关键字,用于编写两个返回相同 type 具有相同列数的记录的 sql 查询(列名可以不同,但​​两个查询的别名应该相同)。

    Select Top 1 PersonsName From MyTable Where IsMale = '1' Order by NewID() union Select Top 1 PersonsName From MyTable Where IsMale = '0' Order by NewID()

    【讨论】:

    • 这与 Scott Chamberlain 的回答不完全相同,只是你有 union 而不是 union all - 为什么要尝试将第二行作为重复项删除?
    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2019-07-15
    相关资源
    最近更新 更多