【问题标题】:How to prevent duplicated records when applying ORDER BY NEWID() to fetch them randomly?应用 ORDER BY NEWID() 随机获取记录时如何防止重复记录?
【发布时间】:2014-02-24 19:46:00
【问题描述】:

我尝试使用Return rows in random order 中提供的解决方案在我的查询中获取随机记录。但是我必须将 NEWID() 添加到我想要获取的列列表中,否则我将无法添加 ORDER BY NEWID() 。不幸的是,它使我的结果集包含重复的记录。

为了进一步澄清,由于请求的列中存在 NEWID(),此查询使我的结果重复:

SELECT distinct top 4 
              Books.BookID,
              Books.Authors,                  
              Books.ShortTitle,               
              NEWID()                 
  FROM Books 
  inner join Publishers on Books.PublisherID = Publishers.PublisherID

  ORDER BY NEWID()

如何解决无法获取唯一记录的问题(这里 BookID 是 PK)?

【问题讨论】:

  • 如果BookID 是主键,你如何获得任何重复值?

标签: sql sql-server select sql-order-by newid


【解决方案1】:

您绝对想将newid() 添加到每一行。这将撤消distinct。相反,将group byorder bynewid() 一起使用:

  SELECT top 4 b.BookID, b.Authors, b.ShortTitle              
  FROM Books b inner join
       Publishers p
       on b.PublisherID = p.PublisherID
  GROUP BY b.BookId, b.Authors, B.ShortTitle
  ORDER BY NEWID();

它会正常工作的。您可以按不在select 列表中的值排序。

【讨论】:

  • 没有。它不起作用。错误:如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中。
  • @Farshid 。 . .写完之后觉得好笑。答案是group by
  • 您删除了 DISTINCT 。不会影响记录的唯一性吗?
  • @Farshid 。 . .不会。group by 会删除重复值。
  • 感谢戈登和赞恩
【解决方案2】:

或者,如果您仍想使用 NEWID,只需在分配新 ID 之前制作一个不同的列表:

SELECT a.BookID, a.Authors, a.ShortTitle FROM
(SELECT distinct top 4 
          Books.BookID AS BookID,
          Books.Authors AS Authors,                  
          Books.ShortTitle AS ShortTitle,                              
FROM Books 
inner join Publishers on Books.PublisherID = Publishers.PublisherID) a
ORDER BY NEWID()

【讨论】:

  • 不,我不想在我的专栏中提及 NEWID()。它使结果有重复,
  • 好的,如果您从 select 语句的第一行中删除 NEWID(),它仍然会为每一行分配一个 NEWID 并返回随机唯一值。
  • 我对上面的代码进行了调整-希望有所帮助
猜你喜欢
  • 2018-06-06
  • 2013-08-23
  • 1970-01-01
  • 2015-08-23
  • 1970-01-01
  • 2016-08-24
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多