sql 左连接问题~

2016-05-24 15:21:12 +08:00
 grey5659
SELECT g.* FROM kjj.dbo.GoodsStocks g LEFT JOIN kjy.dbo.ptype p1
ON p1.typeId=g.PtypeId LEFT JOIN kjy.dbo.ptype p2
ON p2.typeId=p1.ParId LEFT JOIN kjy.dbo.ptype p3
ON p3.typeId=p2.ParId LEFT JOIN kjy.dbo.ptype p4
ON p4.typeId=p3.ParId
WHERE p4.typeId<>'00006'
这什么意思额 连接这么多个搞不懂了
1573 次点击
所在节点    问与答
6 条回复
cxbig
2016-05-24 16:02:08 +08:00
这是个 single table inheritance ,这 SQL 的条件是 ptype 第 4 层 typeId 不等于 00006 的 GoodsStocks 数据
cxbig
2016-05-24 16:04:13 +08:00
这个 ptype 的表有没有 column 是记录层级的?如果有直接限定层级,就不用反复链表。
saulshao
2016-05-24 19:25:26 +08:00
kjy.dbo.ptype 这个表是个自关联的,用 ParId 指向当前行的父行。
左连接这么一大堆,是因为试图找出当前行的祖父或者曾祖父。
好吧,其实这样我觉得不好,还是递归逻辑更清晰。
LEFT
2016-05-24 23:16:39 +08:00
商品信息表通常喜欢这样干,猜测这个应该是类似商品大中小类的关系吧, ptype 存储的数据应该是类似分类关系,通过自连,小类找父级(中类),中类找父级(大类),不同的是你这里的层级更多。
dexterz
2016-05-24 23:59:54 +08:00
可以把这个查询拆分,用 CTE
grey5659
2016-05-25 13:34:31 +08:00
@LEFT 是的 现在工作要接触到这些 sql ,还有存储过程,游标等等,有点懵,有没有比较实际点的练习题可以练练手,最好从简单到复杂的都有~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/280913

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX