日期:2014-05-19  浏览次数:20616 次

求一个查询的SQL语句或者是存储过程
我有两个表,一个是商品表。一个是类别表。
商品表里有商品编号、商品名称、类别编号。
类别表里有类别编号、类别名称和父类别编号。类别表是一个自连接的表。其中父类编号就是类别表的外键。例如存放数据为:

类别编号       类别名称     父类编号
1                     食品               NULL
2                     副食品           1
3                     糖                   2
4                     白糖               3
5                     红糖               3
6                     绵白糖           4
7               梅花牌绵白糖     6
8                     饮料               2
9                   碳酸饮料         8
10               维生素饮料       8
11                   雪碧               9
12                   可乐               9
13                   粒粒橙           10
14                   主食品           1
15                   肉类               14
16                   蔬菜               14

商品表的类别编号是类别表的类别编号的外键,现在我需要根据一个类别编号的到这个类别的所有的子类的商品信息。例如我得到了副食品的类别编号为2,那么就要把关于副食品以及副食品的所有子类的商品信息全部查询出来,这里便当然就不应该包括主食品、肉类和蔬菜的商品信息。现在的一个关键问题是我不知道一个类别下面到底有多少字类别。
怎么写出SQL语句以满足这样的查询呢?先谢谢大虾了,我想了一个晚上了都没有想出来该怎么写   ,帮帮忙吧。

------解决方案--------------------
--建立函數
Create Function F_GetChildren(@类别编号 Int)
Returns @类别表 Table (类别编号 Int, 类别名称 Nvarchar(20), 父类编号 Int)
As
Begin
Insert @类别表 Select * From 类别表 Where 类别编号 = @类别编号 Or 父类编号 = @类别编号
While @@Rowcount > 0
Insert @类别表 Select A.* From 类别表 A Inner Join @类别表 B On A.父类编号 = B.类别编号 And A.类别编号 Not In (Select 类别编号 From @类别表)
Return
End
GO
--測試
Select * From dbo.F_GetChildren(2)
Select * From dbo.F_GetChildren(14)
------解决方案--------------------
--建立測試環境
Create Table 类别表
(类别编号 Int,
类别名称 Nvarchar(20),
父类编号 Int)
Insert 类别表 Select 1, N '食品 ', Null
Union All Select 2, N '副食品 ', 1
Union All Select 3, N '糖 ', 2
Union All Select 4, N '白糖 ', 3
Union All Select 5, N '红糖 ', 3
Union All Select 6, N '绵白糖 ', 4
Union All Select 7, N '梅花牌绵白糖 ', 6
Union All Select 8, N '饮料 ', 2
Union All Select 9, N '碳酸饮料 ', 8
Union All Select 10, N '维生素饮料 ', 8
Union All Select 11, N '雪碧 ', 9
Union All Select 12, N '可乐