j****n 发帖数: 190 | 1 平时用SQL都处理简单的问题,今天电面被问到,几分钟内还真是不知道怎么处理:
有一个table A,2 columns, 5 rows as follows:
Children parents
a b
b c
c d
e f
f g
可以看到b是a的parent,c是b的parent,以此类推。要求找出最顶端的"祖宗",即返回
以下table:
a d
b d
c d
e g
f g
想知道用SQL怎么处理呢? |
d******a 发帖数: 238 | 2 这个得写个pl/sql的函数吧,我感觉select语句做不了。 |
w**z 发帖数: 8232 | 3 start with/connect by in oracle
【在 j****n 的大作中提到】 : 平时用SQL都处理简单的问题,今天电面被问到,几分钟内还真是不知道怎么处理: : 有一个table A,2 columns, 5 rows as follows: : Children parents : a b : b c : c d : e f : f g : 可以看到b是a的parent,c是b的parent,以此类推。要求找出最顶端的"祖宗",即返回 : 以下table:
|
j****n 发帖数: 190 | 4 找到一个答案:http://www.adp-gmbh.ch/ora/sql/connect_by.html
从未用过也不知道start with/connect by,sigh...
有没有其他方法可以用简单的SQL语句解决的呢? |
t***t 发帖数: 6066 | 5 select t.child, roots.parent from
test_conn t, (select parent from test_conn p where not exists (select child
from test_conn c where c.child=p.parent)) roots
where roots.parent in (select parent from test_conn m start with m.child=t.
child connect by prior parent=child)
奶奶的,就算事先知道connect by,几分钟也很难写出来啊。 |
s******e 发帖数: 108 | 6 select t2.c,t2.r from
(select child c1,max(level) m from A connect by prior child=parent
group by child) t1,
(select child c, level l,connect_by_root(parent) r
from A connect by prior child=parent) t2
where t1.c1=t2.c and t1.m=t2.l |
m*********h 发帖数: 764 | 7 MSSQL
--function
create function [dbo].[FindParents]
(
@child char(1)
)
returns char(1)
begin
Declare @temParents char(1)= null
WHILE EXISTS(SELECT * FROM A WHERE child=@child)
BEGIN
SELECT @temParents =(SELECT parents from A where child=@child)
return dbo.FindParents(@temParents)
END
IF(@temParents IS NULL)
BEGIN
SET @temParents = @child
END
return @temParents
end
--Table Name A
Child Parents
a b
b c
c d
e f
f g
--Query
SELECT child,(SELECT dbo.FindParents(child)) as parents FROM A
--Result
child parents
a d
b d
c d
e g
f g |
b*******S 发帖数: 17 | 8 在microsoft t-sql似乎可以用WHILE加上update,再利用IN |
|
A**u 发帖数: 2458 | 9 高手啊
【在 m*********h 的大作中提到】 : MSSQL : --function : create function [dbo].[FindParents] : ( : @child char(1) : ) : returns char(1) : begin : Declare @temParents char(1)= null : WHILE EXISTS(SELECT * FROM A WHERE child=@child)
|
j****n 发帖数: 190 | 10 牛的~~~
【在 m*********h 的大作中提到】 : MSSQL : --function : create function [dbo].[FindParents] : ( : @child char(1) : ) : returns char(1) : begin : Declare @temParents char(1)= null : WHILE EXISTS(SELECT * FROM A WHERE child=@child)
|
y****w 发帖数: 3747 | 11 都没听说过recursive CTE??
今天我刚问一个烙印怎么选排序后的第3-5行,也不会。
【在 j****n 的大作中提到】 : 平时用SQL都处理简单的问题,今天电面被问到,几分钟内还真是不知道怎么处理: : 有一个table A,2 columns, 5 rows as follows: : Children parents : a b : b c : c d : e f : f g : 可以看到b是a的parent,c是b的parent,以此类推。要求找出最顶端的"祖宗",即返回 : 以下table:
|
c**d 发帖数: 579 | 12 MS SQL Server
;WITH Hierachy (Children, Parents, L)
AS
(
--root
SELECT Parents, CAST(NULL AS VARCHAR(1)), 0 FROM A
WHERE Parents NOT IN (SELECT Children FROM A)
UNION ALL
--recursion
SELECT T.Children, CAST((CASE WHEN H.L = 0 THEN H.Children ELSE H.
Parents END) AS VARCHAR(1)), (H.L + 1) FROM A T JOIN Hierachy H
ON T.Parents = H.Children
)
SELECT Children, Parents FROM Hierachy WHERE Parents IS NOT NULL
GO |
g*****e 发帖数: 282 | 13 实际工作里一定是写个t-sql function的,递归
【在 w**z 的大作中提到】 : start with/connect by in oracle
|