有人可以建议如何为MS sql server编写sql查询,从以下场景中选择前N个类别中的所有项目吗?
类别表
|idCtegory|strName
------------------
|1 |cat 1
|2 |cat 2
|3 |cat 3
|4 |cat 4
项目表
|idItem|idCategory
------------------
|1 |1
|2 |1
|3 |3
|4 |2
让我们说我想从前2个类别中选择所有项目,因此我希望得到类似的内容
|idItem|idCategory
------------------
|1 |1
|2 |1
|4 |2
我试图加入这些表格,但后来我不知道确切的项目数量。
由于
编辑:
我只是想加入select top(N) idCategory FROM categories group by idCategory
的项目表,我希望它能起作用。
答案 0 :(得分:1)
如果你不想保持联系:
with tops as
(select top 2 i.idcategory, count(*) as num_items
from items i
group by i.idcategory
order by num_items desc)
select i.* from items i join tops t on i.idcategory = t.idcategory
小提琴: http://sqlfiddle.com/#!6/3bebb/7/0
如果你想保持联系:
with tops as
(select top 2 with ties i.idcategory, count(*) as num_items
from items i
group by i.idcategory
order by num_items desc)
select i.* from items i join tops t on i.idcategory = t.idcategory
小提琴: http://sqlfiddle.com/#!6/3bebb/8/0(请注意类别2和3是如何回归的,因为它们各自相关;它们都只有一个项目)
你的预期输出表明你不关心关系,但我想我会指出它以防万一你确实这样做。
答案 1 :(得分:0)
如果通过"顶级类别"你的意思是那些项目最多的你可以使用row_number()
和聚合:
select iditem, id
from (select idcategory, count(*) as cnt, row_number() over (order by count(*) desc) as seqnum
from items
group by idcategory
) c join
items i
on c.idcategory = i.idcategory
where segnum <= 1;