Как предотвратить дублирование записей при применении 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 by
NEWID ()`:
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()