一条sql能否实现这种查询:表内容作为列名的

[复制链接]
查看11 | 回复9 | 2014-2-19 11:55:14 | 显示全部楼层 |阅读模式
表一
col_a
-------------
属性1
属性5
...
表二
col_bcol_c
--------------
属性1aaa
属性2bbb
属性3ccc
属性4ddd
属性5eee

结果
属性1属性5...
-----------------
aaaeee...

第一个表的记录数目不确定;
表二col_b的内容包含表一col_a内容(外键);
查询结果中,表1的col_a列的内容显示为字段名,表2中的col_c列为对应的值;
可否在一条sql语句中实现。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
SQL> col "结果" for a60
SQL> select * from t1;
COL_A
--------------------
属性1
属性3
属性5
SQL> select * from t2;
COL_B
COL_C
-------------------- --------------------
属性1
aaa
属性2
bbb
属性3
ccc
属性4
ddd
属性5
eee
SQL> select replace(col,',',chr(9)) "结果" from (select '1' rn,WMSYS.WM_CONCAT(c
ol_a) col from (select col_a,col_c from t1,t2 where t1.col_a=t2.col_b) union sel
ect '2',WMSYS.WM_CONCAT(col_c) from (select col_a,col_c from t1,t2 where t1.col_
a=t2.col_b));
结果
------------------------------------------------------------
属性1 属性3 属性5
aaa ccc eee
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE10.2.0.1.0Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
ls 提供的方法好像不是lz想要的,不过还是学到了东西
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
用动态SQL。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
我的查询结果的要求是 "属性1属性5..." 这些是查出来记录集的列名
[ 本帖最后由 7up8down 于 2008-8-13 09:24 编辑 ]
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
由于你的列数不确定
所以用一条SQL有点麻烦的
给你一个例子
http://atgc.itpub.net/post/22412/387737
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
原帖由 atgc 于 2008-8-13 09:20 发表
由于你的列数不确定
所以用一条SQL有点麻烦的
给你一个例子
http://atgc.itpub.net/post/22412/387737

多谢 ! 看看
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
原帖由 atgc 于 2008-8-13 09:20 发表
由于你的列数不确定
所以用一条SQL有点麻烦的
给你一个例子
http://atgc.itpub.net/post/22412/387737

还是用过程写的,一个sql好像真的不能实现,至少到现在还没想出来
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
If we have below situation, how do we do it (or can we do it)?
thank you in advance.

COL_A
--------------------
属性1
属性3
属性5
SQL> select * from t2;
COL_B
COL_C
-------------------- --------------------
属性1
aaa
属性1
bbb
属性2
bbb
属性3
ccc
属性3
ddd
属性4
ddd
属性5
eee
属性5
aaa
结果
------------------------------------------------------------
属性1 属性3属性5
aaa ccc eee
bbb ddd aaa
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层

回9楼:
10G的版本:
CREATE TABLE t1 (col_a VARCHAR2(10));
INSERT INTO t1 VALUES ('attr1');
INSERT INTO t1 VALUES ('attr3');
INSERT INTO t1 VALUES ('attr5');

CREATE TABLE t2 (col_b VARCHAR2(10),col_c VARCHAR2(10));
INSERT INTO t2 VALUES ('attr1','aaa');
INSERT INTO t2 VALUES ('attr1','bbb');
INSERT INTO t2 VALUES ('attr2','bbb');
INSERT INTO t2 VALUES ('attr3','ccc');
INSERT INTO t2 VALUES ('attr3','ddd');
INSERT INTO t2 VALUES ('attr4','ddd');
INSERT INTO t2 VALUES ('attr5','eee');
INSERT INTO t2 VALUES ('attr5','fff');
INSERT INTO t2 VALUES ('attr1','ggg'); -- 让attr3形成空档增加点难度
INSERT INTO t2 VALUES ('attr5','hhh');
COMMIT;
with vw_1 AS (SELECT col_b

, col_c

, row_number() over (partition by col_b order by col_c) as rn

, dense_rank() OVER (ORDER BY col_b) as rn_2

FROM t1,t2

WHERE t1.col_a = t2.col_b

)
,vw_driving as (select level l from dual

connect by level<=(select max(rn) from vw_1)

)
,vw_tmp AS (SELECT vw_1.col_b,vw_1.col_c,vw_1.rn_2, l

FROM vw_driving

LEFT JOIN vw_1

PARTITION BY (vw_1.rn_2)

ON l=rn

)
SELECT SYS_CONNECT_BY_PATH(col_b,'
') AS RESULT -- 两个引号之间打一个 TAB, 因为ORACLE不让用CHR(9)
FROM (SELECT DISTINCT col_b, rn_2 FROM vw_1)
WHERE connect_by_isleaf=1
CONNECT BY PRIOR rn_2+1=rn_2
START WITH rn_2=1
UNION ALL
SELECT SYS_CONNECT_BY_PATH(NVL(col_c,'*'),'
') AS RESULT-- 没有的值用 * 填充,也可用空格。两个引号之间打一个 TAB
FROM vw_tmp
WHERE connect_by_isleaf=1
CONNECT BY PRIOR L=L AND PRIOR rn_2+1=rn_2
START WITH rn_2=1;
RESULT
--------------------------------------
attr1 attr3 attr5
aaa ccc eee
bbb ddd fff
ggg * hhh
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行