Как предотвратить дублирование записей при применении ORDER BY NEWID() для их случайного выбора?

Я попытался использовать решение, предоставленное в строке " Возврат" в случайном порядке, для получения случайных записей в моем запросе. Но я должен добавить 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)?

2 ответа

Решение

Вы определенно не хотите добавлять newid() к каждому ряду. Это отменит distinct, Вместо этого используйте group by с order 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 список.

Или, если вы все еще хотите использовать NEWID, просто составьте отдельный список перед назначением нового идентификатора:

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()
Другие вопросы по тегам