2014-02-24 4 views
-1

Return rows in random order에 제공된 솔루션을 사용하여 쿼리에서 임의의 레코드를 가져 오려고했습니다. 하지만 가져 오려는 열의 목록에 NEWID()을 추가해야합니다. 그렇지 않으면 ORDER BY 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입니다)?

+0

, 어떻게 당신이 전혀 중복 된 값을받을 수 있나요을? –

답변

4

틀림없이 을 입력하지 마십시오.은 각 행에 newid()을 추가하려고합니다. 그러면 distinct의 실행이 취소됩니다.

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(); 

그것은 잘 작동합니다 : 대신에,()`order by NEWID로 group by를 사용합니다. select 목록에없는 값으로 주문할 수 있습니다.

+0

아니요. 작동하지 않습니다. 오류 : SELECT DISTINCT가 지정된 경우 ORDER BY 항목이 선택 목록에 나타나야합니다. – Farshid

+0

@Farshid. . . 내가 그것을 쓴 후에 그것은 재미있어 보였다. 대답은'group by '로 고정됩니다. –

+0

DISTINCT를 제거했습니다. 레코드의 고유성에 영향을 미치지 않습니까? – Farshid

3

아니면 여전히 NEWID을 사용하려는 경우, 단지 새로운 ID를 할당하기 전에 별개의 목록을 만들 :

`BookID` 기본 키의 경우
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() 
+0

아니요 내 열에 NEWID()를 언급하고 싶지 않습니다. 결과가 두 개가되도록합니다. – Farshid

+0

Ok SELECT 문에서 맨 위 행의 NEWID()를 제거하면 각 행에 NEWID가 할당되고 임의의 고유 값이 반환됩니다. – ajcarland90

+0

나는 위의 코드를 조정했다. – ajcarland90