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


person Farshid    schedule 24.02.2014    source источник
comment
Если BookID является первичным ключом, как вообще получить какие-либо повторяющиеся значения?   -  person Gordon Linoff    schedule 24.02.2014


Ответы (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.

person Gordon Linoff    schedule 24.02.2014
comment
Нет, это не работает. Ошибка: элементы ORDER BY должны появиться в списке выбора, если указано SELECT DISTINCT. - person Farshid; 24.02.2014
comment
@ Фаршид. . . Это выглядело забавно после того, как я это написал. Ответ зафиксирован с помощью group by. - person Gordon Linoff; 24.02.2014
comment
Вы удалили DISTINCT. Не повлияет ли это на уникальность записей? - person Farshid; 24.02.2014
comment
@ Фаршид. . . Нет. group by удаляет повторяющиеся значения. - person Gordon Linoff; 24.02.2014
comment
Спасибо Гордону и Зейну - person Farshid; 24.02.2014

Или, если вы все еще хотите использовать 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()
person ajcarland90    schedule 24.02.2014
comment
Нет, я не хочу упоминать NEWID () в своих столбцах. Это приводит к двойным результатам, - person Farshid; 24.02.2014
comment
Хорошо, если вы удалите NEWID () из верхней строки в операторе select, он все равно будет назначать каждой строке NEWID и возвращать случайные уникальные значения. - person ajcarland90; 25.02.2014
comment
Я внес изменения в приведенный выше код - надеюсь, что это поможет - person ajcarland90; 25.02.2014