avatar
Linkedin电面的一道SQL题# JobHunting - 待字闺中
j*n
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怎么处理呢?
avatar
d*a
2
这个得写个pl/sql的函数吧,我感觉select语句做不了。
avatar
w*z
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:

avatar
t*t
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,几分钟也很难写出来啊。
avatar
s*e
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
avatar
m*h
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 [email protected])
BEGIN
SELECT @temParents =(SELECT parents from A where [email protected])
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
avatar
b*S
8
在microsoft t-sql似乎可以用WHILE加上update,再利用IN
avatar
A*u
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 [email protected])

avatar
j*n
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 [email protected])

avatar
y*w
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:

avatar
c*d
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
avatar
g*e
13
实际工作里一定是写个t-sql function的,递归

【在 w**z 的大作中提到】
: start with/connect by in oracle
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。