我有一个父表'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声明或加入表格。都具有相同的结果。
有人有想法吗?非常感谢提前!
答案 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