搜索包含父类别和子类别的产品

时间:2010-06-25 14:30:44

标签: sql stored-procedures parent-child

我正在构建购物车网站并使用SQL表

CATEGORY

Id int,
Parent_Id,
Description varchar(100)

数据:

1   0   Electronics
2   0   Furniture
3   1   TVs
4   3   LCD
5   4   40 inches
6   4   42 inches

产品

Id int,
Category_Id int
Description...

数据:

1   5   New Samsung 40in LCD TV
2   6   Sony 42in LCD TV

如您所见,我最后一个子类别只有一列

现在我需要做的是在主页上按主要类别搜索,例如,如果用户点击电子设备,则显示两台电视,因为他们在电子设备上有父母 - 家长 - 父母ID,请记住,产品表确实有类别只有一列。

我应该更新产品表并为类别子项包含6列以解决此问题吗?或者我如何为此构建有效的SQL存储过程?

谢谢

杰里

3 个答案:

答案 0 :(得分:1)

在Oracle中

,您将使用CONNECT BY

答案 1 :(得分:0)

如果您正在使用SQL 2008,那么您可能希望查看HIERARCHYID数据类型。否则,您可能需要考虑重新设计Category表。你现在如何建模,你必须使用递归从儿童笔记到父母或从父母到孩子。

您可以使用嵌套集模型来实现层次结构,而不是使用链接列表模型(这是您拥有的)。搜索Joe Celko和嵌套集模型,你应该能够找到它的一些很好的描述。他还写了an entire book on modeling trees and hierarchies in SQL。嵌套集模型需要一些设置来维护数据,但在选择数据时更容易使用。由于您的类别可能会保持相对稳定,因此它似乎是一个很好的解决方案。

编辑:要真正回答你的问题......你可以编写一个存储过程,该过程位于WHILE循环中,选择子项并收集表变量中找到的任何产品。在每个循环中检查@@ ROWCOUNT,如果它为0,那么你已经到了最后。然后你只需从你的表变量中选择。这是一种递归(和慢)方法,这就是为什么这种类型的模型在SQL中很多情况下都不能很好地工作。

在几乎任何情况下,您都不应该只在产品表中添加6个(或7个或8个)类别ID。坏。坏。坏。这将是一个维护噩梦等等(当你的类别深入7级时会发生什么......然后8 ......然后9。

答案 2 :(得分:0)

使用递归CTE来做到这一点!就像一场梦! http://msdn.microsoft.com/en-us/library/ms186243.aspx