求一条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