【问题标题】:Select unique random rows from SQL Server table but always duplicates从 SQL Server 表中选择唯一的随机行,但总是重复
【发布时间】:2014-09-10 17:10:12
【问题描述】:

我不是最擅长使用 sql,但我尽我所能完成我的问题。我有一个“只是”表,里面填满了列( ID (PK, Identity), Char, Serv , Random )。现在我想从这个表中选择一个随机行并将其插入到表“f_WinGet”中。到目前为止,我所有的程序都很好地执行了这一步,但我总是在第二个表中得到重复项。

第一个表:84 行 第二张表:需要 84 个中的 35 个。

我尝试了许多其他方法,但总是得到相同的结果。我所有的随机程序都绑定到一个 C# 程序中的按钮。到目前为止一切正常,但我的表中总是有一些重复的行。

 INSERT INTO f_TWinGet 
     SELECT TOP 1 Percent Char, Serv, Random
          FROM ( select distinct  Char, Serv, Random from dbo.just) as derived1 
               ORDER BY CHECKSUM(NEWID())

如果有人想我如何解决我的问题,那就太好了。我还在努力,但我得到的总是一样的结果。

【问题讨论】:

  • 如果您插入相同的记录,那是因为您一直选择相同的记录。 Top 1 不是随机函数,它只是选择结果集中的第一行
  • 您说您只想要一行,但实际上您选择的是行中的TOP 1 PERCENT。此外,如果dbo.just 表中的行数很少,那么无论使用何种随机化,在多次查询后仍然会出现一些重复。
  • 到目前为止,我理解您所说的要点。我尝试让每次单击按钮以选择 1 个随机行并将其传输到第二个表。到目前为止,您在 datagridview 中看到了添加过程,因此需要按下按钮 35x 并始终得到一个随机行但不一样,谁已经在第二个表中。我不需要第一个表中的记录,所以我正在考虑摆脱第一个表中选择的行,这样当我获取下一个时我不能两次获得同一行
  • 如果你想选择随机的非重复行,你必须在数据库或程序中标记已经选择的行(从结果中排除它们),或者只是从头开始生成整个随机序列(在应用程序端可能会更好,更容易)。

标签: c# sql sql-server random rows


【解决方案1】:

如果您想插入 35 行,请一次性完成:

INSERT INTO f_TWinGet(char, serv, random)
     SELECT TOP 35 Char, Serv, Random
     FROM (select distinct  Char, Serv, Random
           from dbo.just
          ) derived1 
     ORDER BY CHECKSUM(NEWID());

如果你真的想一次做一个,我建议使用not exists

INSERT INTO f_TWinGet(char, serv, random)
     SELECT TOP 1 Char, Serv, Random
     FROM (select distinct  Char, Serv, Random
           from dbo.just
          ) d
    WHERE not exists (select 1 from f_TWinGet f where t.char = f.char and t.serv = f.serv and t.random = f.random)
     ORDER BY CHECKSUM(NEWID());

注意char 是一个保留字,所以它应该用方括号括起来。我将在您的查询中留下您的姓名。

【讨论】:

    【解决方案2】:

    如果你的桌子那么小,你可以使用类似的东西:

    INSERT INTO f_TWinGet
    SELECT TOP 1 j.Char, j.Serv, j.Random
    FROM dbo.just j 
    LEFT JOIN f_TWinGet f
    ON f.Char = j.Char
    AND j.Serv = f.Serv
    AND j.Random = f.Random
    WHERE f.Char IS NULL
    ORDER BY NEWID()
    

    这样可以确保您尝试插入的值不在最终表格中。

    【讨论】:

    • ty 提供帮助,当我尝试此方法时,我收到所有三列的错误消息“Meldung 209, Ebene 16, Status 1, Prozedur get_W, Zeile 10 Ambiguous column name 'Char'
    • 该列位于 2 个不同的表中,因此您必须指定哪一个
    • 我假设两个表都有相同的列“Char”、“Serv”和“Random”,因此您需要在列名前加上要从中选择的表的别名。我已经更新了声明。只需将 select char, serv... 更改为选择 j.char, j.serv, ...
    • ty ,我知道这是一个非常简单的问题,我很慌张,遇到了很多麻烦。
    • 这发生在我们所有人身上。不客气,我很高兴能为您提供帮助。
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2016-06-17
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多