是面试的一道SQL题 要求如下:有一张表T_family 有三个字段 id(不为零)、name、pid(如果没有父亲,则为零),
id和pid是对应的 表结构如下:
id name pid
1 A 0
2 B 1
3 C 2
4 D 3
5 E 4
.. .. ..
.. .. ..求出做过爷爷的人
id和pid是对应的 表结构如下:
id name pid
1 A 0
2 B 1
3 C 2
4 D 3
5 E 4
.. .. ..
.. .. ..求出做过爷爷的人
解决方案 »
- Oracle 实时同步 Postgre 如何实现?
- 关于clob作为输入参数传到存储过程的求助
- 求助
- oracle11 win32 windows xp 下安装失败
- 急需帮助:在WindowsXp Pro下安装Oracle11g无法创建数据库
- sqlserver 里的where '1=1' and username="my" 在oracle里怎么写
- 问一个简单的 更改表约束的sql写法 问题
- 菜鸟哭求一个SQL语句!!!对于高手来说是很容易.....
- 向高手请教
- oracle数据库在官网下载只下载了file1文件 导致数据库没有scott用户
- oracle spatial 存储3D数据?
- 急救!!! to_date函数
不过按表的结果,应该是会有多个家庭,就会有多个PID=0的
就复杂了
没有PK 只有这个表 而且是有多个家庭的,还有PID=0的
下面的结构:
id name pid
1 A 0
2 B 1
3 C 2
4 D 3
5 E 4
6 F 0
7 G 6
8 H 5
9 I 7
.. .. ..
.. .. ..
区分家庭我觉得pid=0作为一个家庭的开始
WITH t_family AS
(SELECT 1 ID, 'A' NAME, 0 pid
FROM DUAL
UNION ALL
SELECT 2, 'B', 1
FROM DUAL
UNION ALL
SELECT 3, 'C', 2
FROM DUAL
UNION ALL
SELECT 4, 'D', 3
FROM DUAL
UNION ALL
SELECT 5, 'E', 4
FROM DUAL
UNION ALL
SELECT 6, 'F', 0
FROM DUAL
UNION ALL
SELECT 7, 'G', 6
FROM DUAL
UNION ALL
SELECT 8, 'H', 5
FROM DUAL
UNION ALL
SELECT 9, 'I', 7
FROM DUAL)
SELECT ID, NAME, pid
FROM (SELECT aa.*,
LEAD (lv, 2, lv) OVER (PARTITION BY family_id ORDER BY lv)
- lv gf
FROM (SELECT a.*, LEVEL lv,
SUBSTR
(SYS_CONNECT_BY_PATH (ID, ','),
2,
DECODE (INSTR (SYS_CONNECT_BY_PATH (ID, ','),
',',
1,
2
),
0, LENGTH (SYS_CONNECT_BY_PATH (ID,
',')
),
INSTR (SYS_CONNECT_BY_PATH (ID, ','),
',',
1,
2
)
- 2
)
) family_id
FROM t_family a
START WITH pid = 0
CONNECT BY PRIOR ID = pid) aa)
WHERE gf = 2结果Row# ID NAME PID1 1 A 0
2 2 B 1
3 3 C 2
4 4 D 3
5 6 F 0
ROW#那一列不用看,只是我的TOAD级结果集编号
where ez.pid=bb.id and bb.pid=yy.id
SQL> select * from t_family; FID NAME PID
---------- -------------------- ----------
1 A 0
2 B 1
3 C 2
4 D 3
5 E 4
8 H 6
9 H 57 rows selectedSQL>
SQL> select root_first,
2 max(NAME)
3 from (
4 select connect_by_root fid as root_first
5 from t_family tf
6 connect by prior pid = fid
7 )results,
8 t_family
9 where fid = root_first
10 group by root_first
11 having count(*) > 1;ROOT_FIRST MAX(NAME)
---------- --------------------
2 B
3 C
4 D
5 E
9 HSQL>