日期:2014-05-17  浏览次数:20510 次

求一条SQL语句,谢谢
大家好,求一条SQL语句,以下是说明:

一张商品表 T_Goods(GoodsId,StoreId) 
一张商品分类表:T_GoodsType(TypeId,ParentId,TypeName) (分类只有两级)ParentId=0 为父级
一张商品和分类相关表,因为商品和分类是多对多的关系:T_GoodsRe_Type(GoodsId,TypeId)
一张专卖店表 T_Store(StoreId)
现在提供一个专卖店ID(StoreId),查这个专卖店下面存在的商品的商品分类。

SELECT TypeId,ParentId,TypeName FROM T_GoodsType WHERE EXISTS(SELECT TypeId FROM T_GoodsRe_Type WHERE (T_GoodsRe_Type.TypeId=T_GoodsType.TypeId) AND EXISTS(SELECT GoodsId FROM T_Goods WHERE T_Goods.GoodsId=dbo.T_GoodsRe_Type.GoodsId AND StoreId=14))
以上这条语句可以查出所有子类,但无法查询出父类,在不用union all 的情况下有没有好的办法解决,ths!

------解决方案--------------------
你可以建视图嘛,多省事
------解决方案--------------------
用视图。
------解决方案--------------------
用视图的设计界面用鼠标点,点出来Sql就出来了
------解决方案--------------------
很简单。

如果出于性能考虑,GoodsType加个字段比如Path。

用来保存当前的上下级的id

比如2的下级是1和3
那么1的path 就是,2,1,
那么3的path 就是,3,1,

查询父类别的时候 like ',自己的id,%' 这样就可以得到自己和所有下级栏目。
------解决方案--------------------
如果懒又是sqlserver 2005,可以用新功能 -- with 关键字。
------解决方案--------------------
即使用 WITH 关键字时,要是采用递归方式的话还是用了 union all;
看来只能另加字段来标注了
------解决方案--------------------
SQL code

因为只有两级

declare @StoreID int;
with w_type as 
(
select B.TypeID,C.ParentID from T_Goods A 
    inner join T_GoodsRe_Type B on A.GoodsID=B.GoodsID 
    inner join T_GoodsType C on C.TypeID=B.TypeID 
where StoreID=@StoreID
)
select distinct TypeID from 
(
select B.TypeID from w_type 
union all
select B.TypeID from w_type A inner join T_GoodsType B on A.ParentID=B.TypeID
) A