SQL如何写?

水中影子 2010-11-09 02:09:06
原数据如下
ID FName FParent
--------------------------
101 现金
10101 人民币 101
10102 美元 101
10103 欧元 101

想得到

ID FName FParent fFullName
--------------------------
101 现金 现金
10101 人民币 101 现金-人民币
10102 美元 101 现金-美元
10103 欧元 101 现金-欧元

谢谢了!
...全文
229 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
水中影子 2010-11-09
  • 打赏
  • 举报
回复
谢谢各位,使用2楼递归已解决!
菩提本无树 2010-11-09
  • 打赏
  • 举报
回复
select a.id, a.fname, a.fparent,(case when a.fparent is null then a.fname else b.fname||'-'||a.fname end) ffullname
from maney a
left join maney b on a.fparent = b.id
这样也是对的
表结构代码
create table MANEY
(
ID VARCHAR2(20) not null,
FNAME VARCHAR2(20),
FPARENT VARCHAR2(20)
)
菩提本无树 2010-11-09
  • 打赏
  • 举报
回复
这样写 我已经测试过了
select m.id,m.fname,m.fparent,(case when m.fparent is null then m.fname else m2.fname||'-'||m.fname end) ffullname from maney m ,(
select fname from maney m1 where m1.fparent is null) m2
祝兄弟们好运
心中的彩虹 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 xuhuanchao 的回复:]
原数据如下
ID FName FParent
--------------------------
101 现金
10101 人民币 101
10102 美元 101
10103 欧元 101

想得到

ID FName FParent fFullName
--------------------------
101 现金 现金
10101 人民币 101 现金……
[/Quote]

的递归

SQL> with tb as
2 (
3 select 101 ID,'现金' FName,null FParent from dual union all
4 select 10101,'人民币',101 from dual union all
5 select 10102,'美元',101 from dual union all
6 select 10103,'欧元',101 from dual
7 )
8 select id,FParent,FName,substr(sys_connect_by_path(FName,'-'),2)
9 from tb
10 start with FParent is null
11 connect by prior id=FParent
12
SQL> /

ID FPARENT FNAME SUBSTR(SYS_CONNECT_BY_PATH(FNA
---------- ---------- ------ --------------------------------------------------------------------------------
101 现金 现金
10101 101 人民币 现金-人民币
10102 101 美元 现金-美元
10103 101 欧元 现金-欧元
minitoy 2010-11-09
  • 打赏
  • 举报
回复
SQL> select a.id, a.fname, a.fparent, decode(b.fname,null,null,b.fname||'-') || a.fname
2 from t_money a
3 left join t_money b on a.fparent = b.id
4 ;

ID FNAME FPARENT DECODE(B.FNAME,NULL,NULL,B.FNA
---------- -------------------------------------------------------------------------------- ---------- --------------------------------------------------------------------------------
10103 欧元 101 现金-欧元
10102 美元 101 现金-美元
10101 人民币 101 现金-人民币
101 现金 现金

SQL>

把现金列的'-'去掉
lnuwhy 2010-11-09
  • 打赏
  • 举报
回复
select a.id,,a,fname,a.fparent,nvl2(b.fname,b.name||'-'||a.fname,a.fname) fFullName
from 你的表 a,你的表 b
where a.fparent=b.id(+);
minitoy 2010-11-09
  • 打赏
  • 举报
回复
如果只是两层的话.
SQL> select a.id, a.fname, a.fparent, b.fname || '-' || a.fname
2 from t_money a
3 left join t_money b on a.fparent = b.id
4 ;

ID FNAME FPARENT B.FNAME||'-'||A.FNAME
---------- -------------------------------------------------------------------------------- ---------- --------------------------------------------------------------------------------
10103 欧元 101 现金-欧元
10102 美元 101 现金-美元
10101 人民币 101 现金-人民币
101 现金 -现金

SQL>
minitoy 2010-11-09
  • 打赏
  • 举报
回复
 
SQL> select * from t_money;

ID FNAME FPARENT
---------- -------------------------------------------------------------------------------- ----------
101 现金
10101 人民币 101
10102 美元 101
10103 欧元 101

SQL>
SQL> select id,
2 fname,
3 fparent,
4 substr(sys_connect_by_path(a.fname, '-'), 2) fFullName
5 from t_money a
6 start with a.fparent is null
7 connect by prior id = fparent
8 ;

ID FNAME FPARENT FFULLNAME
---------- -------------------------------------------------------------------------------- ---------- --------------------------------------------------------------------------------
101 现金 现金
10101 人民币 101 现金-人民币
10102 美元 101 现金-美元
10103 欧元 101 现金-欧元

SQL>
gelyon 2010-11-09
  • 打赏
  • 举报
回复

WITH tab AS(
SELECT '101' id, '现金' FName ,NULL FParent FROM dual UNION ALL
SELECT '10101', '人民币', '101' FROM dual UNION ALL
SELECT '10102', '美元', '101' FROM dual UNION ALL
SELECT '10103', '欧元', '101' FROM dual
)
SELECT id,FName,FParent,
CASE WHEN
FParent IS NULL THEN FName
ELSE
(select FName FROM tab WHERE id=a.FParent )||'-'||a.FName
end fFullName
FROM tab a

ID FNAME FPARENT FFULLNAME
-------------------------------------------
101 现金 现金
10101 人民币 101 现金-人民币
10102 美元 101 现金-美元
10103 欧元 101 现金-欧元

3,494

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧