d*g 发帖数: 62 | 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 | d*g 发帖数: 62 | 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
| j*****n 发帖数: 1781 | 3 somewhat interesting, let me think... | B*****g 发帖数: 34098 | 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...
| B*****g 发帖数: 34098 | 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
| j*****n 发帖数: 1781 | 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'),
| d*g 发帖数: 62 | 7 需要写个SQL在Oracle 和 DB2下都能运行
多谢!
【在 B*****g 的大作中提到】 : Let us know what is your DB.
| j*****n 发帖数: 1781 | 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'),
| B*****g 发帖数: 34098 | 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,
| j*****n 发帖数: 1781 | 10 why need loop?
【在 B*****g 的大作中提到】 : 没有loop呀。
| | | B*****g 发帖数: 34098 | 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?
| B*****g 发帖数: 34098 | 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,
| j*****n 发帖数: 1781 | 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
| B*****g 发帖数: 34098 | 14 NND, cheap M$
【在 j*****n 的大作中提到】 : 哦,看来我得重新装个sql server 了。不然连测试的环境都没。 : auto format? : 你指的是像在.net 里面能够自动转换大小写和调整位置吧? : SSMS 没见着有。
| j*****n 发帖数: 1781 | 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
| j*****n 发帖数: 1781 | 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
| d*****c 发帖数: 15 | 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
| B*****g 发帖数: 34098 | 18 lz又没有feedback。
【在 j*****n 的大作中提到】 : 嗯,你的在05下面 work.
| j*****n 发帖数: 1781 | 19 放入黑名单。。。咱们辛苦回帖为哪般?
【在 B*****g 的大作中提到】 : lz又没有feedback。
| B*****g 发帖数: 34098 | 20 牛年不回生面空问题了。
【在 j*****n 的大作中提到】 : 放入黑名单。。。咱们辛苦回帖为哪般?
| | | d*****c 发帖数: 15 | 21 小心翼翼来拍马:)
“生面空”是谁?拖出来50大板子
【在 B*****g 的大作中提到】 : 牛年不回生面空问题了。
| U****D 发帖数: 113 | 22 生面孔。
【在 d*****c 的大作中提到】 : 小心翼翼来拍马:) : “生面空”是谁?拖出来50大板子
| d*****c 发帖数: 15 | 23 恩,恩,谢谢解惑。
你是生面孔不?如果是,请多回Beijing等大侠的贴,如果不是,请多回我们生面孔的
贴。
多谢多谢罗
【在 U****D 的大作中提到】 : 生面孔。
|
|