SQL Server 上关于同一张表里的三级联动
或许这并不能叫做三级联动,三级联动是很容易实现的东西,有明确的层级关系,一般分开三张表存储。我在公司的项目里遇到这样一个问题,同一张表里面,有分公司,客户,项目3种关系,他们的层级关系是这样:分公司-客户-项目。也就是说,分公司下有多个客户,每个客户下又有多个项目,但是他们保存在了同一张表,用一个父级ID的字段保存他们之间的关系,比如说项目的父级ID是2,那么他就是ID为2的客户的项目。具体请看下表:
MID | MCType | Name | FatherID |
2 | 分公司 | 分公司一 | NULL |
9 | 客户 | 客户一 | 2 |
18 | 项目 | 项目一 | 9 |
20 | 客户 | 客户二 | 2 |
22 | 客户 | 客户三 | 23 |
23 | 分公司 | 分公司二 | NULL |
关系很明确。至于为什么数据库的表设计成这个样子,不要问我,公司老大设计的……
现在我要从这张表里获取“分公司一”下面的客户和项目,注意,是同时获取客户和项目,两种数据都要。换个角度说,就是提出分公司不为“分公司一”的所有记录,取剩下的。原本觉得很麻烦的,想全部拿出来再在C#里筛选,可是后来一想,这张表的数据量太大了,这样做不现实,还是用一个sql语句查出来就好了。于是想了好久好久,想到这个方法:
先取出“分公司一”的客户ID,然后左右两边分别连接,取出两张表,再合并起来,性能没测试……赶脚好垃圾的样子……
select tt.* From (select XFJPlaceMark.* from (select MID from XFJPlaceMark where FatherID={0}) as t,XFJPlaceMark where XFJPlaceMark.MID=t.MID UNION select XFJPlaceMark.* from (select MID from XFJPlaceMark where FatherID={0}) as t,XFJPlaceMark where XFJPlaceMark.FatherID=t.MID as tt
里面的{0}就是你要写的参数,填分公司的ID,在这张表里就是“2”。
本人sql语句不是很熟悉,只能想到这个办法,如有高手请支招!