首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

小弟我快崩溃了,大家来帮帮忙吧

2012-01-13 
我快崩溃了,大家来帮帮忙吧有这样两张表:表A(主键AID)表B(主键BID)AID NameBID AID Name Text1a11xa12b21y

我快崩溃了,大家来帮帮忙吧
有这样两张表:
表A(主键AID) 表B(主键BID)
AID Name BID AID Name Text
1 a 1 1 x a1
2 b 2 1 y a2
3 c 3 1 z a3
  4 2 r a4
  5 3 s a5

现在两表关联查询,希望出来这样的结果:
AID A.Name Text
1 a a1,a2,a3
2 b a4
3 c a5

不能在程序里处理...所以该怎么写这个查询SQL?
可以用临时表...

有这样两张表:
表A(主键AID) 表B(主键BID)
AID Name BID AID Name Text
1 a 1 1 x a1
2 b 2 1 y a2
3 c 3 1 z a3
  4 2 r a4
  5 3 s a5

现在两表关联查询,希望出来这样的结果:
AID A.Name Text
1 a a1,a2,a3
2 b a4
3 c a5

不能在程序里处理...所以该怎么写这个查询SQL?
可以用临时表...



[解决办法]
又是一个合并报表的问题
把我的这个代码拿去看一下

/*现在有如下两张表分别为:
表A
ID Name
1 张三
2 李四
表B
ID XMMC CODE RYID
1 A项目一 XMONE 1
2 A项目二 XMTWO 1
3 A项目三 XMTHREE 1
4 B项目一 XMONE 2

要求一条SQL语句实现如下结果

表C
ID NAME XMONE XMTWO XMTHREE
1 张三 A项目一 A项目二 A项目三
2 李四 B项目一 [空] [空]
 
 */
 --建表
 create table testa
 (
 id int,
 name varchar2(20)
 );
 create table testb
 (
 id int ,
 xmmc varchar2(20),
 code varchar2(20),
 ryid int
 );
 --原始数据
insert into testa values( 1,'张三' );
insert into testa values( 2,'李四 ' );
insert into testb values( 1,'A项目一','XMONE',1 );
insert into testb values( 2,'A项目二','XMTWO', 1 );
insert into testb values( 3,'A项目三','XMTHREE',1 );
insert into testb values( 4,'B项目一','XMONE',2 );
--创建视图
create or replace view v_one
as
select a.id,a.name,b.xmmc as xmone 
from testa a,testb b
where a.id= b.ryid and code='XMONE'

create or replace view v_two
as
select a.id,a.name,b.xmmc as xmtwo 
from testa a,testb b
where a.id= b.ryid and code='XMTWO'

create or replace view v_three
as
select a.id,a.name,b.xmmc as xmthree 
from testa a,testb b
where a.id= b.ryid and code='XMTHREE'
--生成报表
select a.*,b.xmtwo ,c.xmthree from v_one a,v_two b ,v_three c where a.id=b.id(+) and a.id=c.id(+)


如果要想三列在一个字段里显示用||这个连接符就可以了

[解决办法]
table:
CREATE TABLE TEST (XM VARCHAR(8), SL INTEGER);
INSERT INTO TEST
VALUES ('王一', 2),
('王一', 5),
('张二', 4),
('张二', 5),
('张二', 8),
('李三', 2),
('李三', 4),
('李三', 15),
('李三', 29);


WITH B (FATHER,SON,XM,CHAIN) AS
(SELECT A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON,
A.XM, rtrim(ltrim(CHAR(A.SL))) 
FROM TEST A 
UNION ALL
SELECT C.FATHER,C.SON,C.XM,rtrim(ltrim(B.CHAIN))||','||rtrim(ltrim(C.SL))


FROM (SELECT A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,
A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, 
A.XM, rtrim(ltrim(CHAR(A.SL))) AS SL FROM TEST A) AS C, B
WHERE B.SON= C.FATHER) 

SELECT D.XM,D.CHAIN
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY XM ORDER BY LENGTH(CHAIN) DESC) AS ROW_NUM, B.XM,B.CHAIN FROM B) AS D
WHERE D.ROW_NUM = 1;

result:
XM CHAIN
-------- -----------
李三 2,4,15,29
王一 2,5
张二 4,5,8


我在DB2 测试成功,oracle 也应该都有的,
[解决办法]
现在给出我的答案:
第一次接触 sys_connect_by_path... 话到正题

SQL code
--table structSQL> desc A; 名称                                                  是否为空? 类型 ----------------------------------------------------- -------- ------------------------------------ AID                                                   NOT NULL NUMBER(3) NAME                                                           CHAR(4)                                          SQL> desc B; 名称                                                  是否为空? 类型 ----------------------------------------------------- -------- ------------------------------------ BID                                                   NOT NULL NUMBER(3) AID                                                            NUMBER(3) NAME                                                           CHAR(4) TEXT                                                           CHAR(4)  --DatasSQL> SELECT * FROM A;       AID NAME---------- ----         1 a         2 b         3 cSQL> SELECT * FROM B;       BID        AID NAME TEXT---------- ---------- ---- ----         1          1 x    a1         2          1 y    a2         3          1 z    a3         4          2 r    a4         5          3 s    a5 

热点排行