【发布时间】:2016-08-08 22:05:58
【问题描述】:
我面临的问题是,我需要来自 3 个表联合数据的最大 12 行。但是,如果任何表没有固定行,则应考虑其他表的剩余行。
例如:我有 3 张桌子 产品 类别 制造商
案例 1:如果每个都有 10 行,那么我们应该从每个表中选择 4 行。 案例 2:如果产品表有 3 行和类别,则制造商有 5 行 每个,比它应该从产品中选择 3 个,从类别或制造商中选择 5 个。 案例 3:所有的行数都少于 4 行,而不是显示的可用行数。
请帮助我实现这一目标。我正在发布我迄今为止创建的存储过程。
Create PROCEDURE [dbo].[GetRowsfromtables]
@SearchTerms nvarchar(150)
AS
BEGIN
create table #search (id int identity ,ids int, productname nvarchar(200), categoryname nvarchar(200), tagname nvarchar(200), SeName nvarchar(200), displayorder int)
insert into #search
Select Top 12 p.Id as ids, p.name as productname, '' as categoryname, '' as tagname, '' as SeName, 0 as displayorder from Product p where p.Published = 1 and p.Deleted = 0 and name like '%' + @SearchTerms + '%'
union
Select Top 12 c.id as ids, '' as productname, c.name as categoryname, '' as tagname, '' as SeName , 1 as displayorder from Category c where c.Published = 1 and c.Deleted = 0 and Name like '%' + @SearchTerms + '%'
union
Select Top 12 t.id as ids, '' as productname, '' as categoryname, t.Name as tagname, '' as SeName, 2 as displayorder
from Manufacturer
where Name like '%' + @SearchTerms + '%'
Select id, ids,productname,categoryname, tagname, SeName, tagpcount,tagproductid,
'' as ThumbnailImage, displayorder, (Select count(*) from #search where displayorder = 0) as ptotal,
(Select count(*) from #search where displayorder = 1) as ctotal,
(Select count(*) from #search where displayorder = 2) as tagtotal,
row_number() over(partition by displayorder order by id ) as rn
from #search
order by displayorder
drop table #search
END
【问题讨论】:
-
TOPwithoutORDER BY为您提供搜索引擎选择的任何内容。 -
你快到了。您的查询从 #search 中选择并应用一个订单(您别名为 rn 的列),但随后不使用它。按 rn 排序并将 TOP 12 添加到 select 语句中。
标签: sql-server tsql sql-server-2012