如何打印出去重的层次关系树?

[复制链接]
查看11 | 回复9 | 2015-3-6 11:57:31 | 显示全部楼层 |阅读模式
我有一个层次关系的表,
第1个字段是大类,第2个字段是中类,第3个字段是小类.
请问: 怎样可以过滤掉重复的类别数据? 得到如下的查询结果,谢谢!
--------------------------------------------------------------
USAAL AL_V1

AL_V2

AL_V3

CA CA_V1

CA_V2
CN HK HK_V1

HK_V2

TW TW_V1

TW_V2

TW_V3


1.USA1.AL 1.AL_V1

2.AL_V2

3.AL_V3

2.CA 1.CA_V1

2.CA_V2
2.CN 1.HK 1.HK_V1

2.HK_V2

2.TW1.TW_V1

2.TW_V2

3.TW_V3




源代码如下:
create table T_A
(
country_abbrvarchar2(50),
state_abbrvarchar2(50),
villiage_abbr varchar2(50)
);
insert into T_A values('USA','AL','AL_V1');
insert into T_A values('USA','AL','AL_V2');
insert into T_A values('USA','AL','AL_V3');
insert into T_A values('USA','CA','CA_V1');
insert into T_A values('USA','CA','CA_V2');
insert into T_A values('CN', 'HK','HK_V1');
insert into T_A values('CN', 'HK','HK_V2');
insert into T_A values('CN', 'TW','TW_V1');
insert into T_A values('CN', 'TW','TW_V2');
insert into T_A values('CN', 'TW','TW_V2');复制代码
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
[php]
SQL> select * from t_a;

COUNTRY_ABBR
STATE_ABBR
VILLIAGE_ABBR
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
USA
AL
AL_V1
USA
AL
AL_V2
USA
AL
AL_V3
USA
CA
CA_V1
USA
CA
CA_V2
CN
HK
HK_V1
CN
HK
HK_V2
CN
TW
TW_V1
CN
TW
TW_V2
CN
TW
TW_V2

10 rows selected

SQL>
SQL> select
2 decode(t.country_abbr,lag(t.country_abbr) over(partition by t.country_abbr order by t.country_abbr),null,t.country_abbr) ca,
3 decode(t.state_abbr,lag(t.state_abbr) over(partition by t.state_abbr order by t.state_abbr),null,t.state_abbr) va,
4 t.villiage_abbr
5from t_a t
6;

CA
VA
VILLIAGE_ABBR
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
CN
HK
HK_V1

HK_V2

TW
TW_V1

TW_V2

TW_V2
USA
AL
AL_V1

AL_V2

AL_V3

CA
CA_V1

CA_V2

10 rows selected

SQL>
[/php]
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
有玉了,我再抛个砖
selectdecode(s_n+v_n,2,c_n||'.'||country_abbr,null) country_abbr ,
decode(v_n,1,s_n||'.'||state_abbr,null) state_abbr ,
v_n||'.'||villiage_abbrvilliage_abbr
from
(select dense_rank() over( order by country_abbr)
c_n, country_abbr ,

dense_rank()over(partition bycountry_abbr order by country_abbr,state_abbr) s_n, state_abbr ,

row_number() over(partition bycountry_abbr,state_abbr order by villiage_abbr)v_n ,villiage_abbr
from
t_a
)
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
如果不限制重复行,还可以这样
select country_abbr a

, state_abbr b

, villiage_abbr c

from t_a
group by rollup(country_abbr,state_abbr,villiage_abbr)
having villiage_abbr is not null

order by 2
[ 本帖最后由 ts_keta 于 2007-12-28 15:04 编辑 ]
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
非常感谢"无名扫把 "和grubbyoo!
你们分别回答了第1个和第2个问题.
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
學習!
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
扫把的方法的确不错
我们一般的思维是nvl(),把NULL值处理成其他的值,现在把其他的值处理成NULL,有意思!
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
两位老大都很厉害,用的都是分析函数.
致: 走到哪里才不是过客.
你写的SQL中的下面代码很别致, 受益韭浅,谢谢!
-------------------------------------------------------------------------------
decode(s_n+v_n, 2, c_n||'.'||country_abbr,null) country_abbr,
dense_rank() over( order by country_abbr)
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
My two cents
SELECT DECODE (country_rn, 1, country_abbr, NULL) country_abbr,
DECODE (state_rn, 1, state_abbr, NULL) state_abbr, villiage_abbr
FROM (SELECT country_abbr, state_abbr, villiage_abbr,

ROW_NUMBER () OVER (PARTITION BY country_abbr ORDER BY country_abbr)

country_rn,

ROW_NUMBER () OVER (PARTITION BY state_abbr ORDER BY state_abbr)

state_rn

FROM t_a)
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
"无名扫把 "和grubbyoo!的方法都把decode()使用得很妙,值得標記,學習。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行