SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name FROM (SELECT ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x') RN, T2.RNUM, t1.name FROM T1 T1, (SELECT T.RNUM, REGEXP_SUBSTR(T.id, '[^,]+', 1, LEVEL) STR FROM (SELECT t.id, ROWNUM RNUM FROM T2 T) T CONNECT BY LEVEL <= (LENGTH(T.id) - LENGTH(REPLACE(T.id, ',', ''))) / LENGTH(',') + 1 AND PRIOR RNUM = RNUM AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) T2 WHERE T1.ID = T2.STR) T3 START WITH T3.RN = 1 CONNECT BY PRIOR RN = RN - 1 AND PRIOR T3.RNUM = T3.RNUM GROUP BY T3.RNUM order by t3.rnum;
直接的用replace函数存在什么问题?
id是否是连续的 id随机出现
提问 @zlloct 第12行 PRIOR DBMS_RANDOM.VALUE IS NOT NULL 的作用是什么?原文 SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name FROM (SELECT ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x') RN, T2.RNUM, t1.name FROM T1 T1, (SELECT T.RNUM, REGEXP_SUBSTR(T.id, '[^,]+', 1, LEVEL) STR FROM (SELECT t.id, ROWNUM RNUM FROM T2 T) T CONNECT BY LEVEL <= (LENGTH(T.id) - LENGTH(REPLACE(T.id, ',', ''))) / LENGTH(',') + 1 AND PRIOR RNUM = RNUM AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) T2 WHERE T1.ID = T2.STR) T3 START WITH T3.RN = 1 CONNECT BY PRIOR RN = RN - 1 AND PRIOR T3.RNUM = T3.RNUM GROUP BY T3.RNUM order by t3.rnum;
接上面 第二行 ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x' 为什么 用 order by 'x' ,x 实际上不存在的
万分感谢,但实在不好意思,有些地方我没有看懂,能不能给我讲一下 第一行 LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name 中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗
万分感谢,但实在不好意思,有些地方我没有看懂,能不能给我讲一下 第一行 LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name 中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗你从内向外一层层看 不就知道是什么意思了
Q1: ORACLE有个检查,如果你有前后连接条件(id=PRIOR id),但是同一行数据再次出现,它就会报一个错: ORA-01436: CONNECT BY loop in user data.这里用了一个PRIOR DBMS_RANDOM.VALUE, 因为DBMS_RANDOM.VALUE每次调用都返回不同结果,所以它认为两行数据不一样,所以不报错了. Q2: 因为这里不用排序,必须保留原来的顺序,如果强制排序可能会出现(3,1,2)->('张三','李四','王五'),这样结果就不对了,我们必须保留原来的顺序,但是ROW_NUMBER()OVER()中必须使用ORDER BY,所以就随便写了个'x'
第一行 LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name 中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗 基本思路是将一行的字段按‘,’拆分,然后替换成name,然后再拼接。 t3.name是表的name字段,括号外的name只是别名,可以随便命名。rownum的作用是为了在拼接的时候能够区分哪些字段是属于同一行的. 你太厉害了,谢谢谢谢!!!
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x') RN,
T2.RNUM,
t1.name
FROM T1 T1,
(SELECT T.RNUM, REGEXP_SUBSTR(T.id, '[^,]+', 1, LEVEL) STR
FROM (SELECT t.id, ROWNUM RNUM FROM T2 T) T
CONNECT BY LEVEL <=
(LENGTH(T.id) - LENGTH(REPLACE(T.id, ',', ''))) /
LENGTH(',') + 1
AND PRIOR RNUM = RNUM
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) T2
WHERE T1.ID = T2.STR) T3
START WITH T3.RN = 1
CONNECT BY PRIOR RN = RN - 1
AND PRIOR T3.RNUM = T3.RNUM
GROUP BY T3.RNUM
order by t3.rnum;
id随机出现
第12行 PRIOR DBMS_RANDOM.VALUE IS NOT NULL 的作用是什么?原文
SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x') RN,
T2.RNUM,
t1.name
FROM T1 T1,
(SELECT T.RNUM, REGEXP_SUBSTR(T.id, '[^,]+', 1, LEVEL) STR
FROM (SELECT t.id, ROWNUM RNUM FROM T2 T) T
CONNECT BY LEVEL <=
(LENGTH(T.id) - LENGTH(REPLACE(T.id, ',', ''))) /
LENGTH(',') + 1
AND PRIOR RNUM = RNUM
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) T2
WHERE T1.ID = T2.STR) T3
START WITH T3.RN = 1
CONNECT BY PRIOR RN = RN - 1
AND PRIOR T3.RNUM = T3.RNUM
GROUP BY T3.RNUM
order by t3.rnum;
第二行 ROW_NUMBER() OVER(PARTITION BY T2.RNUM order by 'x' 为什么 用 order by 'x' ,x 实际上不存在的
第一行 LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name
中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗
第一行 LTRIM(MAX(SYS_CONNECT_BY_PATH(T3.NAME, ',')), ',') name
中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗你从内向外一层层看 不就知道是什么意思了
t3.name是表的name字段,括号外的name只是别名,可以随便命名。rownum的作用是为了在拼接的时候能够区分哪些字段是属于同一行的.
ORACLE有个检查,如果你有前后连接条件(id=PRIOR id),但是同一行数据再次出现,它就会报一个错:
ORA-01436: CONNECT BY loop in user data.这里用了一个PRIOR DBMS_RANDOM.VALUE, 因为DBMS_RANDOM.VALUE每次调用都返回不同结果,所以它认为两行数据不一样,所以不报错了.
Q2:
因为这里不用排序,必须保留原来的顺序,如果强制排序可能会出现(3,1,2)->('张三','李四','王五'),这样结果就不对了,我们必须保留原来的顺序,但是ROW_NUMBER()OVER()中必须使用ORDER BY,所以就随便写了个'x'
中的T3.NAME和括号外的name分别代表的是什么,还有T2.RNUM和t3.RNUM都是什么意思啊,代表的什么吗
基本思路是将一行的字段按‘,’拆分,然后替换成name,然后再拼接。
t3.name是表的name字段,括号外的name只是别名,可以随便命名。rownum的作用是为了在拼接的时候能够区分哪些字段是属于同一行的.
你太厉害了,谢谢谢谢!!!