一个sql存储过程问题(较曲折)

Devin_lee 2006-06-30 11:22:05
外部变量 @ID (此值为表tbl_IndexFile的CategoryID)

tbl_CompanyFile:
CompanyID CompanyName CompanyProfile ...
1 公司名称一 公司介绍
2 公司名称二 公司介绍
3 公司名称三 公司介绍

tbl_ProductFile:
ProductID CompanyID ProductName ...
1 1 产品名称
2 1 产品名称
3 1 产品名称
4 1 产品名称
5 1 产品名称
(以上是公司名称一产品列表)

6 2 产品名称
7 2 产品名称
8 2 产品名称
9 2 产品名称
10 2 产品名称
(以上是公司名称二产品列表)

11 3 产品名称

tbl_CategoryFile:
CategoryID CategoryName ParentCategory(父级分类ID)
1 分类名称一 0
2 分类名称二 1
3 分类名称三 2
4 分类名称四 0
5 分类名称五 4
6 分类名称六 0

以上分类树以下结构:
分类名称一
|-------分类名称二
| |---------分类名称三
| |---------更多...
分类名称四
|-------分类名称五
|-------更多...
| |-------更多....
分类名称六
|

(可以看出,分类有可能一级分类下面有二级分类或者有三级分类,或者一级分类没有下级分类)

tbl_IndexFile:
IND ProductID CategoryID
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3
7 3 1
8 3 2
9 3 3
10 4 4
11 5 5
(以上是公司名称一产品分类列表,可以看出,其实属于分类ID(CategoryID)1、2、3是最多的)

12 6 1
13 6 2
14 6 1
15 7 2
16 7 1
17 7 2
18 8 1
19 8 2
20 8 3
21 9 4
22 10 5
(以上是公司名称二产品分类列表,也可以看出,其实属于分类ID(CategoryID)1、2是最多的)

23 11 6

要求:(目前数据结构不能动了 :( )

依据tbl_CompanyFile表中的CompanyID找tbl_ProductFile表对应的CompanyID,就得到了tbl_CompanyFile表CompanyName所对应的产品列表,然后再依

据tbl_IndexFile表,得出产品所属分类最多CategoryID值,这一步就可得知某个公司的所有产品相对来说,产品所属分类最多的是那个分类,也就得到这个分类最

多的CategoryID值,然后这个最多的CategoryID值再与变量@ID比较,如果两个值相等,就返回某个公司的信息

备注:因为每个产品牵涉到一级或多级分类,所以不管点其中那一级分类,只要某个公司产品所属分类在点击的当级分类中是最多的(如果产品都属于一、二、三

个级别分类,就会出现三个最多了,当然这三个最多值其实是相等的)信息

比如:当变量 @ID=1 时,就会列出公司名称一与公司名称二的相应信息,当变量 @ID=2 时,也会列出公司名称一与公司名称二的相应信息,当变量 @ID=3时,

就只会列出公司名称一的相应信息

现在要一个sql存储过程,能解决以上问题,当然,如果同仁们有更好的解决方法,十分感谢!
...全文
255 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwh999 2006-07-03
  • 打赏
  • 举报
回复
/*--假想结果1 --*/

CompanyName
--------------------
公司名称二
公司名称一

(所影响的行数为 2 行)


--假想结果2

CompanyName CompanyProfile ProductID ProductName
-------------------- -------------------- ----------- --------------------
公司名称一 公司介绍 1 产品名称
公司名称一 公司介绍 2 产品名称
公司名称一 公司介绍 3 产品名称
公司名称二 公司介绍 8 产品名称

(所影响的行数为 4 行)
--*/ -- 完成




上面的结果,是以CategoryID=3查得的结果,实际情况,在SELECT语句中请根据需求自行变更...
wwh999 2006-07-03
  • 打赏
  • 举报
回复
Use pubs

create table tbl_CompanyFile(CompanyID int identity(1,1),CompanyName nvarchar(100),CompanyProfile nvarchar(100))
insert tbl_CompanyFile select N'公司名称一', N'公司介绍'
union all select N'公司名称二', N'公司介绍'
union all select N'公司名称三', N'公司介绍'

--(公司名称 产品列表)
create table tbl_ProductFile(ProductID int identity(1,1),CompanyID int,ProductName nvarchar(100))
insert tbl_ProductFile select 1,N'产品名称'
union all select 1,N'产品名称'
union all select 1,N'产品名称'
union all select 1,N'产品名称'
union all select 1,N'产品名称'
union all select 2,N'产品名称'
union all select 2,N'产品名称'
union all select 2,N'产品名称'
union all select 2,N'产品名称'
union all select 2,N'产品名称'
union all select 3,N'产品名称'

create table tbl_CategoryFile(CategoryID int identity(1,1),CategoryName nvarchar(100),ParentCategory int)--(父级分类ID)
insert tbl_CategoryFile select N'分类名称一', 0
union all select N'分类名称二', 1
union all select N'分类名称三', 2
union all select N'分类名称四', 0
union all select N'分类名称五', 4
union all select N'分类名称六', 0

/*
以上分类树以下结构:
分类名称一
|-------分类名称二
| |---------分类名称三
| |---------更多...
分类名称四
|-------分类名称五
|-------更多...
| |-------更多....
分类名称六
|


(可以看出,分类有可能一级分类下面有二级分类或者有三级分类,或者一级分类没有下级分类)
*/
create table tbl_IndexFile(IND int identity(1,1),ProductID int, CategoryID int)
insert tbl_IndexFile select 1,1
union all select 1,2
union all select 1,3
union all select 2,1
union all select 2,2
union all select 2,3
union all select 3,1
union all select 3,2
union all select 3,3
union all select 4,4
union all select 5,5

union all select 6,1
union all select 6,2
union all select 6,1
union all select 7,2
union all select 7,1
union all select 7,2
union all select 8,1
union all select 8,2
union all select 8,3
union all select 9,4
union all select 10,5

union all select 11,6


GO
--select * from tbl_CompanyFile
--select * from tbl_ProductFile
--select * from tbl_CategoryFile
select * from tbl_IndexFile

/*-- 如果仅需要相关的公司信息用这一句 --*/
select Distinct A.CompanyName
from tbl_CompanyFile A,tbl_ProductFile B,tbl_IndexFile C
where A.CompanyID=B.companyID and B.productID=C.productID and categoryID=3

/*-- 如果需要较全的公司信息和产品信息,用这一句 --*/
select A.CompanyName,A.CompanyProfile,C.ProductID,B.ProductName
from tbl_CompanyFile A,tbl_ProductFile B,tbl_IndexFile C
where A.CompanyID=B.companyID and B.productID=C.productID and categoryID=3

GO
drop table tbl_CompanyFile
drop table tbl_ProductFile
drop table tbl_CategoryFile
drop table tbl_IndexFile

GO
Devin_lee 2006-07-03
  • 打赏
  • 举报
回复
像上面所说的是我的思路,可能不太好,希望各位同仁都提出更好的解决方案...如果分不够,我再加...
Devin_lee 2006-07-03
  • 打赏
  • 举报
回复
相对来说,产品所属分类最多的是那个分类,也就得到这个分类最多的CategoryID值,然后这个最多的CategoryID值再与变量@ID比较,如果两个值相等,就返回某个公司的信息
--------------------------------------------------------------------------------
即是你给定一个值,判断其是否为分类最多的CategoryID,是的话,就返回某个公司信息?

你的这个CateGoryID跟公司在表中有关联吗?在哪里?

---------------------------------------------------------------------------------->>>
这个关联是要通过产品表来体现的,可能我把简单的东东说的复杂了
Devin_lee 2006-07-03
  • 打赏
  • 举报
回复
谢谢各位,可能我没有说清楚
其实是要根据三张表返回符合条件的值
原意是:
一个网站,有一些公司目录(tbl_CompanyFile),每个公司有很多产品,每个公司的产品也分了很多分类,产分类方法是分为二个表,一张表放产品的基本资料(tbl_ProductFile),这个产品表里面有所属公司的ID,一个表是放产品分类(tbl_IndexFile),分类的方法就是tbl_IndexFile表专门用来记录分类,就是一个产品ID对应一个分类ID,如果这个产品属于很多分类,就出现了一个产品ID对应多个分类ID,现在是要实现对公司的分类,分类方法是看一个公司的产品对应的那个分类ID最多,他就属于那个分类。
但是还要注意的是,如果一个分类有三个级别,即是大、中、小分类,某一个产品在分类时,如果是属于这个系列分类的,那么这个产品的ID就会在tbl_IndexFile里面对应了这个系列分类的大、中、小分类的分类ID(CategoryID),存储方法是在数据库里面会出现三条记录,即是如下:
tbl_IndexFile:
IND ProductID CategoryID
1 1 1(大分类)
2 1 2(中分类)
3 1 3(小分类)

因为一个公司的产品有很多,每个公司的产品分类也很多,现在要根据产品所属分类最多一个类来对公司进行分类。

现在给出一个分类的页面,上面是这些公司所有的分类目录(树型目录),我现在比如点击其中一个节点的分类,那么这时候就会传递一个分类ID给另一个显示属于这个分类的公司列表页面,这个公司列表页面,拿着分类目录页面传过来的分类ID,进行对公司的查找,查找的方法是:首先是去公司表(tbl_CompanyFile)找每个公司的产品,即是从产品表(tbl_ProductFile)找里面字段CompanyID等于公司ID的所有产品,找到所属公司的所有产品后,就拿着这些产品去分类表(tbl_IndexFile)找这些产品所对应的分类,如果对应的这些分类其中最多的一个产品分类ID等于分类页面传过去的分类ID值,就返回这个公司的资料给显示公司列表页面,如下图示意图:

分类页面:CompanyCate.aspx
公司列表页面:CompanyList.aspx

从分类页点击其中一个节点分类,其中分类ID值是1,就会弹出一个新页面,地址是:CompanyList.aspx?CategoryID=1,这个CompanyList.aspx页面就是上面所说的公司列表页面,现在是要这个页面显示所有分类ID为1的公司列表,显示方法就是上面所说的那样,先要找公司的产品,再找属于公司产品的分类,如果公司产品分类中某个分类ID有最多的产品,而这个分类ID又等于CompanyList.aspx?CategoryID=1中的CategoryID的值1,就返回这个公司的资料显示在CompanyList.aspx页面,就这样一直下去,直到把所有公司下面的产品分类最多的分类ID值等于?CategoryID=1都显示在这个页面
Devin_lee 2006-07-03
  • 打赏
  • 举报
回复
!!-_-
最高只能100分...
Devin_lee 2006-07-03
  • 打赏
  • 举报
回复
也感谢 wwh999(印钞机V2.0...开发中....)的一直帮助.....
不知用啥感谢好,就只再加50分....
Devin_lee 2006-07-03
  • 打赏
  • 举报
回复
bugchen888(臭虫) ( ) 信誉:100 2006-07-03 17:06:00 得分: 0


select m.CompanyID
from (
select i.CategoryID, p.CompanyID, count(*) as cnt
from tbl_IndexFile i, tbl_ProductFile p
where i.ProductID=p.ProductID
group by i.CategoryID, p.CompanyID) m
where not exists(
select 1
from (
select i.CategoryID, p.CompanyID, count(*) as cnt
from tbl_IndexFile i, tbl_ProductFile p
where i.ProductID=p.ProductID
group by i.CategoryID, p.CompanyID) m1
where m.CompanyID=m1.CompanyID
and m.cnt<m1.cnt)
and m.CategoryID=@ID

-----------------------------------------------------------

我加了个东东,这正是我想要的过程,感谢!!

select
c.CompanyID,
c.CompanyName ,
c....

from (
select i.CategoryID, p.CompanyID, count(*) as cnt
from tbl_IndexFile i, tbl_ProductFile p
where i.ProductID=p.ProductID
group by i.CategoryID, p.CompanyID) m, tbl_CompanyFile c
where not exists(
select 1
from (
select i.CategoryID, p.CompanyID, count(*) as cnt
from tbl_IndexFile i, tbl_ProductFile p
where i.ProductID=p.ProductID
group by i.CategoryID, p.CompanyID) m1
where m.CompanyID=m1.CompanyID
and m.cnt<m1.cnt)
and m.CategoryID=@catname and c.CompanyID=m.CompanyID
bugchen888 2006-07-03
  • 打赏
  • 举报
回复
lz的这个需求跟产品类型的树状结构没有关系.
简单的说:每个公司都有主要的产品类型,只要某种产品类型在该公司的产品总类中占的数量最多,这种产品类型就是该公司的主要产品类型.
输入一个产品类型@ID,得到一些公司列表,这些公司的主要产品类型是@ID.
bugchen888 2006-07-03
  • 打赏
  • 举报
回复
select m.CompanyID
from (
select i.CategoryID, p.CompanyID, count(*) as cnt
from tbl_IndexFile i, tbl_ProductFile p
where i.ProductID=p.ProductID
group by i.CategoryID, p.CompanyID) m
where not exists(
select 1
from (
select i.CategoryID, p.CompanyID, count(*) as cnt
from tbl_IndexFile i, tbl_ProductFile p
where i.ProductID=p.ProductID
group by i.CategoryID, p.CompanyID) m1
where m.CompanyID=m1.CompanyID
and m.cnt<m1.cnt)
and m.CategoryID=@ID
wwh999 2006-07-03
  • 打赏
  • 举报
回复
樓上的在搞什麼...? 也看暈頭了?
铁歌 2006-07-03
  • 打赏
  • 举报
回复
(zt)
展开层次结构
数据库经常存储层次信息。例如,下面的数据是全球一些地区的层次表示形式。这种表示形式并未清楚地显示出数据中隐含的结构。

Parent Child
---------------------------------- ----------------------------------
World Europe
World North America
Europe France
France Paris
North America United States
North America Canada
United States New York
United States Washington
New York New York City
Washington Redmond

而下面的示例则更容易解释:

World
North America
Canada
United States
Washington
Redmond
New York
New York City
Europe
France
Paris

下面的 Transact-SQL 过程将一个编码的层次展开到任意深度。尽管 Transact-SQL 支持递归,但是使用临时表作为堆栈来跟踪所有正在处理中的项目(已经开始但尚未结束),将更加有效。某个项目一旦处理完毕,将被从堆栈中删除。当发现新的项目时,这些项目将被添加到堆栈中。

CREATE PROCEDURE expand (@current char(20)) as
SET NOCOUNT ON
DECLARE @level int, @line char(20)
CREATE TABLE #stack (item char(20), level int)
INSERT INTO #stack VALUES (@current, 1)
SELECT @level = 1

WHILE @level > 0
BEGIN
IF EXISTS (SELECT * FROM #stack WHERE level = @level)
BEGIN
SELECT @current = item
FROM #stack
WHERE level = @level
SELECT @line = space(@level - 1) + @current
PRINT @line
DELETE FROM #stack
WHERE level = @level
AND item = @current
INSERT #stack
SELECT child, @level + 1
FROM hierarchy
WHERE parent = @current
IF @@ROWCOUNT > 0
SELECT @level = @level + 1
END
ELSE
SELECT @level = @level - 1
END -- WHILE

输入参数 (@current) 表示层次中的开始位置。它还跟踪主循环中的当前项目。

使用的两个局部变量分别是 @level(用于跟踪层次结构中的当前级别)和 @line(是用于构造缩进行的工作区)。

SET NOCOUNT ON 语句避免输出中夹杂每个 SELECT 产生的 ROWCOUNT 消息。

使用层次中开始点的项目标识符来创建和整理临时表 #stack,而 @level 被设置为与之匹配。#stack 中的 level 列允许同一个项目出现在数据库的多个级别中。虽然这种情况不适用于该示例中的地理数据,但是它可以用于其它示例。

在下面的示例中,当 @level 大于 0 时,该过程执行以下步骤:

如果当前级别 (@level) 的堆栈中有任何项目,该过程将选择其中一个,并称之为 @current。


缩进项目 @level 空格,然后打印该项目。


从堆栈中删除该项目以免重复处理它,然后将其所有子项目添加到堆栈的下一级 (@level + 1) 中。这是唯一使用层次表 (#stack) 的地方。
如果使用传统的编程语言,就必须找到每个子项目并将其逐个添加到堆栈中。而使用 Transact-SQL,只用一个语句就能找到并添加所有的子项目,以免又使用一个嵌套循环。

如果有子项目 (IF @@ROWCOUNT > 0),则下降一级处理它们 (@level = @level + 1);否则,继续在当前级别上处理。


最后,如果在当前级别的堆栈中没有待处理的项目,则返回到上一级,看上一级是否有待处理的项目 (@level = @level - 1)。当再没有上一级时,则展开完毕。
新鲜鱼排 2006-07-02
  • 打赏
  • 举报
回复
这么复杂的逻辑,你都要想半天,何况我们没有接触到的人了。
以后这么多的数据,建立一个测试环境,这样回答的人会多点。
没有什么思路,感觉你说的“比如:当变量 @ID=1 时,就会列出公司名称一与公司名称二的相应信息,当变量 @ID=2 时,也会列出公司名称一与公司名称二的相应信息,当变量 @ID=3时,
”不是很明白,建立个环境,希望能有高人指点你。
--外部变量 @ID (此值为表tbl_IndexFile的CategoryID)
declare @ID int
set @ID=2

create table tbl_CompanyFile(CompanyID int identity(1,1),CompanyName nvarchar(100),CompanyProfile nvarchar(100))
insert tbl_CompanyFile select N'公司名称一', N'公司介绍'
union all select N'公司名称二', N'公司介绍'
union all select N'公司名称三', N'公司介绍'

--(公司名称 产品列表)
create table tbl_ProductFile(ProductID int identity(1,1),CompanyID int,ProductName nvarchar(100))
insert tbl_ProductFile select 1,N'产品名称'
union all select 1,N'产品名称'
union all select 1,N'产品名称'
union all select 1,N'产品名称'
union all select 1,N'产品名称'
union all select 2,N'产品名称'
union all select 2,N'产品名称'
union all select 2,N'产品名称'
union all select 2,N'产品名称'
union all select 2,N'产品名称'
union all select 3,N'产品名称'

create table tbl_CategoryFile(CategoryID int identity(1,1),CategoryName nvarchar(100),ParentCategory int)--(父级分类ID)
insert tbl_CategoryFile select N'分类名称一', 0
union all select N'分类名称二', 1
union all select N'分类名称三', 2
union all select N'分类名称四', 0
union all select N'分类名称五', 4
union all select N'分类名称六', 0

/*
以上分类树以下结构:
分类名称一
|-------分类名称二
| |---------分类名称三
| |---------更多...
分类名称四
|-------分类名称五
|-------更多...
| |-------更多....
分类名称六
|


(可以看出,分类有可能一级分类下面有二级分类或者有三级分类,或者一级分类没有下级分类)
*/
create table tbl_IndexFile(IND int identity(1,1),ProductID int, CategoryID int)
insert tbl_IndexFile select 1,1
union all select 1,2
union all select 1,3
union all select 2,1
union all select 2,2
union all select 2,3
union all select 3,1
union all select 3,2
union all select 3,3
union all select 4,4
union all select 5,5

union all select 6,1
union all select 6,2
union all select 7,2
union all select 7,1
union all select 7,2
union all select 8,1
union all select 8,2
union all select 8,3
union all select 9,4
union all select 10,5

union all select 11,6


drop table tbl_CompanyFile
drop table tbl_ProductFile
drop table tbl_CategoryFile
drop table tbl_IndexFile
wwh999 2006-07-02
  • 打赏
  • 举报
回复
相对来说,产品所属分类最多的是那个分类,也就得到这个分类最多的CategoryID值,然后这个最多的CategoryID值再与变量@ID比较,如果两个值相等,就返回某个公司的信息
--------------------------------------------------------------------------------
即是你给定一个值,判断其是否为分类最多的CategoryID,是的话,就返回某个公司信息?

你的这个CateGoryID跟公司在表中有关联吗?在哪里?
wwh999 2006-07-02
  • 打赏
  • 举报
回复
Lz,你究竟想干什么?多少张表,,得到的效果,你描述清楚了吗..?把我看晕了...
Devin_lee 2006-06-30
  • 打赏
  • 举报
回复
上贴参考地址:http://community.csdn.net/Expert/topic/4849/4849621.xml?temp=.7454798
Devin_lee 2006-06-30
  • 打赏
  • 举报
回复
高人出出手啊...

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧