SQL Server 2005 запрос - случайные дочерние строки уникальных случайных родительских строк - PullRequest
0 голосов
/ 23 августа 2009

Я получил родительскую таблицу «ProductCategory» и дочернюю таблицу «Product». У меня есть этот запрос, который возвращает 3 случайных продукта:

SELECT    TOP (3) ProductId
FROM      Product
ORDER BY NEWID();

Я хочу улучшить этот запрос, чтобы все товары были из разных товарных категорий. Таким образом, запрос для получения уникальных категорий будет:

SELECT    TOP (3) ProductCategoryId
FROM      ProductCategory
ORDER BY NEWID();

Я не могу понять, как объединить эти два запроса для достижения моей цели. Очевидный запрос

SELECT    TOP (3) p.ProductId
FROM      Product p
where p.productcategory_ProductCategoryId in
    (
    SELECT    TOP (3) ProductCategoryId pc
    FROM      ProductCategory pc
    ORDER BY NEWID()
    )
ORDER BY NEWID();

не работает. Кажется, что внутренний оператор выбора игнорируется. Я также пытался с оператором EXISTS или присоединения к таблицам. Все с одинаковым результатом.

У кого-нибудь есть идея? Заранее большое спасибо!

Ответы [ 3 ]

1 голос
/ 23 августа 2009

Вы должны разделить 2 запроса, и это одно из решений

Per ProductCategoryId, коррелированный подзапрос для получения случайного товара. Уникальность ProductCategoryId обрабатывается внешним запросом.

SELECT TOP 3
    (SELECT TOP 1
        ProductId
    FROM
        Product P
    WHERE
        P.ProductCategoryId = PC.ProductCategoryId
    ORDER BY 
        NEWID()
    ) AS ProductId
FROM
    ProductCategory PC
WHERE
    EXISTS (SELECT *
        FROM
            Product Pex
        WHERE
            Pex.ProductCategoryId = PC.ProductCategoryId)
ORDER BY
    NEWID();
1 голос
/ 23 августа 2009

Я получил это сейчас!

В Burbidge87's я добавил условие where:

FROM Product p
where @CategoryID = p.ProductCategory_ProductCategoryId

это делает. Еще раз спасибо!

JJ

0 голосов
/ 23 августа 2009

Как насчет этого? Я смог выполнить эту задачу, используя временную таблицу и курсор. Больше шага, но это работает.

create table #temp(
 productID int
,CategoryID int
)
declare @CategoryID int
declare ID_Cursor cursor
for select ProductCategoryID from ProductCategory order by NEWID() 
open ID_Cursor
FETCH NEXT FROM ID_Cursor INTO @CategoryID

WHILE @@FETCH_STATUS = 0 and (select COUNT(*) from #temp)<3
BEGIN

if (@CategoryID not in (select CategoryID from #temp))
Begin
insert into #temp
SELECT top(1) ProductID, @CategoryID
  FROM [Product] 
  order by NEWID() 
 END 

FETCH NEXT FROM ID_Cursor INTO @CategoryID
END 
CLOSE ID_Cursor
DEALLOCATE ID_Cursor

select * from #temp
drop table #temp 
...