2009-08-22 16 views
0

親テーブル 'ProductCategory'と子テーブル 'Product'が見つかりました。SQL Server 2005クエリ - UNIQUEのランダムな親行のランダムな子行

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

私はすべての製品が異なる製品カテゴリから成っていることを達成するためにそのクエリを強化したいと思います。とてもユニークなカテゴリを取得するためのクエリは、次のようになります。

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

私は私の目標を達成するために、これらの2つのクエリを結合する方法を把握することはできませんよ。明白なクエリ

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

は動作しません。内側のselect文は無視されるようです。私もEXISTSステートメントで試したり、テーブルに参加したりしました。すべて同じ結果です。

誰かがアイデアを持っていますか?ありがとうございます!

答えて

0

どうやってこのようになりますか?私は一時テーブルとカーソルを使ってこのタスクを達成することができました。長い一歩ですが、うまくいきます。

あなたは2つのクエリを分離する必要があり、これは一つの解

パーProductCategoryIdある

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 
1

は、ランダムな製品を得るためにサブクエリを相関していました。 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

今すぐ取得しました。それをしない

FROM Product p 
where @CategoryID = p.ProductCategory_ProductCategoryId 

:Burbidge87ので

私は、WHERE条件を追加しました。再度、感謝します!

JJ

関連する問題