SELECT RNO, MAX(SYS_CONNECT_BY_PATH(ID, ' '))
FROM (SELECT ID,
RNO,
ROW_NUMBER() OVER(PARTITION BY RNO ORDER BY RNO) AS NO,
ROW_NUMBER() OVER(ORDER BY RNO) + RNO AS NNO
FROM (SELECT ID,
ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) AS RNO
FROM empT) A) B
START WITH NO = 1
CONNECT BY NNO - 1 = PRIOR NNO
GROUP BY RNO
ORDER BY RNO
jack913.fan (2008-7-30 22:01:31)
SQL> select * from B1;
ID NAME
-- ----------
A 1
B 1
C 1
D 2
E 2
F 2
G 3
7 rows selected
SQL>
SQL> SELECT ID1,ID2,ID3 FROM
2 (select ROWNUM RN1,ID ID1 from B1 WHERE NAME=1) A,
3 (select ROWNUM RN2,ID ID2 from B1 WHERE NAME=2) B,
4 (select ROWNUM RN3,ID ID3 from B1 WHERE NAME=3) C
5 WHERE RN1=RN2(+) AND RN1=RN3(+)
6 /
写的不错哈
请教这个加号 的含义 。一直没明白
WHERE RN1=RN2(+) AND RN1=RN3(+)
jack913.fan (2008-7-31 10:15:40)
(+)是外连接的意思
SQL> select * from b;
ID NAME
---------- ----------
A 1
B 1
C 1
D 2
E 2
F 2
G 3
已选择7行。
SQL> select max(decode(name,1,id,null)),
2 max(decode(name,2,id,null)),
3 max(decode(name,3,id,null))
4 from
5 (
6 select id,name,row_number() over(partition by name order by id) rn from b)
7 group by rn
8 /
MAX(DECODE MAX(DECODE MAX(DECODE
---------- ---------- ----------
A D G
B E
C F
SQL>
最新回复
chonglei (2008-7-30 14:52:52)
FROM (SELECT ID,
RNO,
ROW_NUMBER() OVER(PARTITION BY RNO ORDER BY RNO) AS NO,
ROW_NUMBER() OVER(ORDER BY RNO) + RNO AS NNO
FROM (SELECT ID,
ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) AS RNO
FROM empT) A) B
START WITH NO = 1
CONNECT BY NNO - 1 = PRIOR NNO
GROUP BY RNO
ORDER BY RNO
jack913.fan (2008-7-30 22:01:31)
ID NAME
-- ----------
A 1
B 1
C 1
D 2
E 2
F 2
G 3
7 rows selected
SQL>
SQL> SELECT ID1,ID2,ID3 FROM
2 (select ROWNUM RN1,ID ID1 from B1 WHERE NAME=1) A,
3 (select ROWNUM RN2,ID ID2 from B1 WHERE NAME=2) B,
4 (select ROWNUM RN3,ID ID3 from B1 WHERE NAME=3) C
5 WHERE RN1=RN2(+) AND RN1=RN3(+)
6 /
ID1 ID2 ID3
--- --- ---
A D G
B E
C F
SQL>
jack913.fan (2008-7-30 22:07:27)
我的写法有两个不足之处:
1.要晓得NAME的DISTINCT的个数,如果个数少就还好,多的化,这种写法就不行了
2.要知道哪个NAME对应的ID最多,这样方便做左联结
期待高手出现!
sieper (2008-7-31 09:14:45)
请教这个加号 的含义 。一直没明白
WHERE RN1=RN2(+) AND RN1=RN3(+)
jack913.fan (2008-7-31 10:15:40)
SQL> select * from b;
ID NAME
---------- ----------
A 1
B 1
C 1
D 2
E 2
F 2
G 3
已选择7行。
SQL> select max(decode(name,1,id,null)),
2 max(decode(name,2,id,null)),
3 max(decode(name,3,id,null))
4 from
5 (
6 select id,name,row_number() over(partition by name order by id) rn from b)
7 group by rn
8 /
MAX(DECODE MAX(DECODE MAX(DECODE
---------- ---------- ----------
A D G
B E
C F
SQL>
这个借鉴别人的一个写法更加简单!
sieper (2008-7-31 11:51:00)