0

我有一个父表“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 语句或加入表。所有的结果都是一样的。

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

4

3 回答 3

1

我现在明白了!

在 Burbidge87 中,我添加了 where 条件:

FROM Product p
where @CategoryID = p.ProductCategory_ProductCategoryId

这样做。再次感谢!

JJ

于 2009-08-23T12:19:06.293 回答
1

您必须解耦 2 个查询,这是一种解决方案

根据 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();
于 2009-08-23T08:51:02.140 回答
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 
于 2009-08-22T23:28:58.823 回答