Redian新闻
>
问一个关于SQL的问题
avatar
问一个关于SQL的问题# Database - 数据库
d*g
1
我有两个表Tree和Group分别定义了一个树 和一个group
Tree:
node parent_nod parent_lvl
1 1 1
2 2 2
2 1 1
3 3 2
3 1 1
4 4 3
4 2 2
4 1 1
5 5 3
5 2 2
5 1 1
6 6 3
6 3 2
6 1 1
7 7 3
7 3 2
7 1 1
8 8 4
8 4 3
8 2 2
8 1 1
Group
node group_id
8 101
5 101
6 102
7 102
现在我想找出Group中每个组中所有node的公共的level最大的parent
比如上例的结果:
Result
group_id max_lvl_parent
101 2
102
avatar
d*g
2
Tree长得象这样
1 ------- level 1
/ \
2 3 ----- level 2
/ \ / \
4 5 6 7 ---- level 3
/ \
8 9 --------------- level 4

【在 d*g 的大作中提到】
: 我有两个表Tree和Group分别定义了一个树 和一个group
: Tree:
: node parent_nod parent_lvl
: 1 1 1
: 2 2 2
: 2 1 1
: 3 3 2
: 3 1 1
: 4 4 3
: 4 2 2

avatar
j*n
3
somewhat interesting, let me think...
avatar
B*g
4
oracle using connect by + level
sql server 2008正在学习中,看看下面这个例子
CREATE TABLE dbo.Company
(CompanyID int NOT NULL PRIMARY KEY,
ParentCompanyID int NULL,
CompanyName varchar(25) NOT NULL)
INSERT dbo.Company (CompanyID, ParentCompanyID, CompanyName)
VALUES
(1, NULL, 'Mega-Corp'),
(2, 1, 'Mediamus-Corp'),
(3, 1, 'KindaBigus-Corp'),
(4, 3, 'GettinSmaller-Corp'),
(5, 4, 'Smallest-Corp'),
(6, 5, 'Puny-Corp'),
(7, 5, 'Small2-Corp')
WITH CompanyTree(ParentCompanyID, CompanyID, CompanyName, CompanyLevel)
AS

【在 j*****n 的大作中提到】
: somewhat interesting, let me think...
avatar
B*g
5
Let us know what is your DB.

【在 d*g 的大作中提到】
: 我有两个表Tree和Group分别定义了一个树 和一个group
: Tree:
: node parent_nod parent_lvl
: 1 1 1
: 2 2 2
: 2 1 1
: 3 3 2
: 3 1 1
: 4 4 3
: 4 2 2

avatar
j*n
6
Common Table Expression (CTE)
New feature since SQL Server 2005. I also thought about it. However, things
seems not as simple as it.
Still thinking...

【在 B*****g 的大作中提到】
: oracle using connect by + level
: sql server 2008正在学习中,看看下面这个例子
: CREATE TABLE dbo.Company
: (CompanyID int NOT NULL PRIMARY KEY,
: ParentCompanyID int NULL,
: CompanyName varchar(25) NOT NULL)
: INSERT dbo.Company (CompanyID, ParentCompanyID, CompanyName)
: VALUES
: (1, NULL, 'Mega-Corp'),
: (2, 1, 'Mediamus-Corp'),

avatar
d*g
7
需要写个SQL在Oracle 和 DB2下都能运行
多谢!

【在 B*****g 的大作中提到】
: Let us know what is your DB.
avatar
j*n
8
not sure if it is right, no testing environment.
anyone can test it?
the DISTINCT may or may not necessary.
SELECT DISTINCT A_list.group_id, max(A_list.parent) max_lvl_parent
FROM
(
SELECT G.group_id, T.parent_nod, T.parent_lvl
FROM Group G, Tree T
WHERE G.node = T.node
) A_list,
(
SELECT G.group_id, T.parent_nod, T.parent_lvl
FROM Group G, Tree T
WHERE G.node = T.node
) B_list
WHERE A_list.Group_id = B_list.Group_id
AND A_list.parent = B_list.parent
AND A_list.parent_l

【在 B*****g 的大作中提到】
: oracle using connect by + level
: sql server 2008正在学习中,看看下面这个例子
: CREATE TABLE dbo.Company
: (CompanyID int NOT NULL PRIMARY KEY,
: ParentCompanyID int NULL,
: CompanyName varchar(25) NOT NULL)
: INSERT dbo.Company (CompanyID, ParentCompanyID, CompanyName)
: VALUES
: (1, NULL, 'Mega-Corp'),
: (2, 1, 'Mediamus-Corp'),

avatar
B*g
9
没有loop呀。

【在 j*****n 的大作中提到】
: not sure if it is right, no testing environment.
: anyone can test it?
: the DISTINCT may or may not necessary.
: SELECT DISTINCT A_list.group_id, max(A_list.parent) max_lvl_parent
: FROM
: (
: SELECT G.group_id, T.parent_nod, T.parent_lvl
: FROM Group G, Tree T
: WHERE G.node = T.node
: ) A_list,

avatar
j*n
10
why need loop?

【在 B*****g 的大作中提到】
: 没有loop呀。
avatar
B*g
11
我看错题了。Tree table里面有多于的data。做下面这个, 假定最顶是level1。
Tree:
node parent_nod
1 1
2 1
3 1
4 2
5 2
6 3
7 3
8 4

【在 j*****n 的大作中提到】
: why need loop?
avatar
B*g
12
Your code seems not work.
Finally got time to do it, it is harder than I expected. My code is still
need to be reviewed.
select A.group_id, A.parent_nod AS "max_lvl_parent"
from (
SELECT G.group_id, T.parent_nod,T.parent_lvl,
ROW_NUMBER() over (partition by G.group_id order by T.parent_lvl desc) Lvl_
Rank
FROM [Group] G, Tree T
WHERE G.node = T.node
group by G.group_id, T.parent_nod, T.parent_lvl
having not exists (select G2.node
from [Group] G2
where G2.group_id = G.group_id


【在 j*****n 的大作中提到】
: not sure if it is right, no testing environment.
: anyone can test it?
: the DISTINCT may or may not necessary.
: SELECT DISTINCT A_list.group_id, max(A_list.parent) max_lvl_parent
: FROM
: (
: SELECT G.group_id, T.parent_nod, T.parent_lvl
: FROM Group G, Tree T
: WHERE G.node = T.node
: ) A_list,

avatar
j*n
13
哦,看来我得重新装个sql server 了。不然连测试的环境都没。
auto format?
你指的是像在.net 里面能够自动转换大小写和调整位置吧?
SSMS 没见着有。

【在 B*****g 的大作中提到】
: Your code seems not work.
: Finally got time to do it, it is harder than I expected. My code is still
: need to be reviewed.
: select A.group_id, A.parent_nod AS "max_lvl_parent"
: from (
: SELECT G.group_id, T.parent_nod,T.parent_lvl,
: ROW_NUMBER() over (partition by G.group_id order by T.parent_lvl desc) Lvl_
: Rank
: FROM [Group] G, Tree T
: WHERE G.node = T.node

avatar
B*g
14
NND, cheap M$

【在 j*****n 的大作中提到】
: 哦,看来我得重新装个sql server 了。不然连测试的环境都没。
: auto format?
: 你指的是像在.net 里面能够自动转换大小写和调整位置吧?
: SSMS 没见着有。

avatar
j*n
15
嗯,我的code 的确不work.
整了半天才装了个2000。不用05的原因是想看看能不能用standard sql 写。

【在 B*****g 的大作中提到】
: Your code seems not work.
: Finally got time to do it, it is harder than I expected. My code is still
: need to be reviewed.
: select A.group_id, A.parent_nod AS "max_lvl_parent"
: from (
: SELECT G.group_id, T.parent_nod,T.parent_lvl,
: ROW_NUMBER() over (partition by G.group_id order by T.parent_lvl desc) Lvl_
: Rank
: FROM [Group] G, Tree T
: WHERE G.node = T.node

avatar
j*n
16
嗯,你的在05下面 work.

【在 B*****g 的大作中提到】
: Your code seems not work.
: Finally got time to do it, it is harder than I expected. My code is still
: need to be reviewed.
: select A.group_id, A.parent_nod AS "max_lvl_parent"
: from (
: SELECT G.group_id, T.parent_nod,T.parent_lvl,
: ROW_NUMBER() over (partition by G.group_id order by T.parent_lvl desc) Lvl_
: Rank
: FROM [Group] G, Tree T
: WHERE G.node = T.node

avatar
d*c
17
记得在oralce PL/SQL 里面看到一个关于 Hierarchical Data Retrieval.跟你的问题
很像,你可以试试。如果你不是用oracle,就不知道了
(Oracle Database 10g PL/SQL Progamming的132页里的例子改造一下应该可以用)
语法大概是:
SELECT max(LEVEL)
INTO 。。。
FROM Tree
START WITH 。。。
CONNECT BY PRIOR parent_node = node

【在 d*g 的大作中提到】
: 我有两个表Tree和Group分别定义了一个树 和一个group
: Tree:
: node parent_nod parent_lvl
: 1 1 1
: 2 2 2
: 2 1 1
: 3 3 2
: 3 1 1
: 4 4 3
: 4 2 2

avatar
B*g
18
lz又没有feedback。

【在 j*****n 的大作中提到】
: 嗯,你的在05下面 work.
avatar
j*n
19
放入黑名单。。。咱们辛苦回帖为哪般?

【在 B*****g 的大作中提到】
: lz又没有feedback。
avatar
B*g
20
牛年不回生面空问题了。

【在 j*****n 的大作中提到】
: 放入黑名单。。。咱们辛苦回帖为哪般?
avatar
d*c
21
小心翼翼来拍马:)
“生面空”是谁?拖出来50大板子

【在 B*****g 的大作中提到】
: 牛年不回生面空问题了。
avatar
U*D
22
生面孔。

【在 d*****c 的大作中提到】
: 小心翼翼来拍马:)
: “生面空”是谁?拖出来50大板子

avatar
d*c
23
恩,恩,谢谢解惑。
你是生面孔不?如果是,请多回Beijing等大侠的贴,如果不是,请多回我们生面孔的
贴。
多谢多谢罗

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