2 qq 38224386 qq_38224386 于 2017.09.19 12:53 提问

关于sql查询的一道面试题

a是b的上司,b是c的上司,c是d的上司。如何设计表来存放?然后如何取a下面的所有下属?(是取a下面的所有,包含子目录),现在我的问题是表是添加一个parentid字段,然后如何写sql语句?求大神解答

10个回答

cyjdapao
cyjdapao   2017.09.19 13:25

a 最大的 --》 b ---》 c----》d
select * from a
left join b on b.id = a.id
left join c on c.id =b.id
left join d on d.id = c.id

alter table a add clumn parentid int

qq_34042441
qq_34042441   2017.09.19 14:01

你好,你可以理解:a,b,c,d为4个层结构。表结构:id,floorid,name,paretnid,type.申明:如A的floorid 可以为A0000000
B可以为A0B00000的八位数字。如果查询a的所有下属机构 like‘A0%’

qq_33106591
qq_33106591   2017.09.19 14:22

设计两个表,第一个存储的A,B,C,D的基本信息,还有一个表是关系信息。比如有parentid和childerid。这样在查询的时候只需要在一个表中查询。
但是查询的时候要一层一层遍历

Mr_Huang_ning
Mr_Huang_ning   2017.09.19 14:41

这不就是简单的表关联吗,自己和自己关联

s_tg14
s_tg14   2017.09.19 14:47

图片说明

Mr_Huang_ning
Mr_Huang_ning   2017.09.19 14:49

select b.id as id,a.id as fid,b.name as name,a.name as fname from 表名1 a inner join 表名1 b on a.id=b.parentid

r562253897
r562253897   2017.09.19 16:30

一张表就可以,增加code字段,具有以下规律
a_code 001
b_code 001001
c_code 001001001
d_code 001001001001

查询A的所有子节点
select * from table where a_code like '001%'

andriod132
andriod132   2017.09.19 16:48

我用oracle来回答你吧,懒得去查了,毕竟思路是跨越语言的

|| 代表拼接字段

SELECT
ID||'@@'||CODE||'@@'||NAME||'@@'||SHORTNAME||'@@'||BUSINESSTYPE||'@@'||path ,path
FROM
tb_bizbase_psorg
where
path like 'A,%'
order by
path desc

            结果是A,  和  A,B,  和   A,B,D, 等都会查出来,

            ![图片说明](http://img.ask.csdn.net/upload/201709/19/1505810478_903312.png)

            类似多叉树,A,代表一级组织,A,B,代表二级组织,以此类推,如图

            ![图片说明](http://img.ask.csdn.net/upload/201709/19/1505810820_772465.jpg)
andriod132
andriod132   2017.09.19 16:49

图片显示不了,不知道咋回事

u011212427
u011212427   2017.09.19 17:51

通过表关联的方式有局限性,如果在多一个层级你就要改一次sql。
表结构:
ID,PARENTID,PARENTIDS,在PARENTIDS中存放所有祖先,比如[1],[2],[3],[4],左右加上标签,逗号分开。加标签是防止Like匹配时,匹配到意外数据,比如
匹配%1%,可能匹配到1,10,11等等,但是你只想到1的后代,加上标签以后匹配%[1]%,这样匹配出来的都是1的后代。这种结果也有缺点,如果层级结构
变化,需要修改所有后代的PARENTIDS。所以结构比较稳定的情况可以用。

Csdn user default icon
上传中...
上传图片
插入图片