sql server 2005 query - UNIQUE随机父行的随机子行

时间:2009-08-22 21:33:53

标签: sql-server-2005 random parent-child

我有一个父表'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();

不起作用。看起来内部select语句被忽略了。我也尝试过EXISTS声明或加入表格。都具有相同的结果。

有人有想法吗?非常感谢提前!

3 个答案:

答案 0 :(得分:1)

你必须解耦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 :(得分:1)

我现在知道了!

在Burbidge87中我添加了一个where条件:

FROM Product p
where @CategoryID = p.ProductCategory_ProductCategoryId

这样做。再次感谢!

JJ

答案 2 :(得分:0)

这样的事情怎么样?我能够使用临时表和游标完成此任务。更长的一步,但它的工作原理。

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