问题描述
我有一张下面的表
R_ID R_Site R_Name R_Role
-
1 123,-456,-789 qwer所有者
2 56,-741-852 qaz经理
3 369,-741,-987 wsx员工
4所有eddc员工
5名所有rfv员工
并使用下面的查询将R_Site逗号分隔的值转换为行
选择REGEXP_SUBSTR (txt,'[^,]',1,级别) 作为站点,R_NAME
从 (选择不同的R_SITE作为txt,从MY_TABLE中选择R_NAME
按级别连接 <= 长度 (regexp_replace(txt,'[^,] *')) 1
现在,我需要将上述结果集连接到R_SITE(SITE) = S_SITE上的下表,以在最终结果中获取S_Sal值
S_ID s_s_s_mgr
----- ------ -----
1 -789 10000 Raghu
2 -123 20000马赫什
3 -456 300000 Swetha
4 -147 400000 Vamsi
5所有500000纳伦德拉
但是当我加入时,数据库一直在旋转,没有给出任何结果。
您能否让我知道我是否在任何步骤中做错了,以及纠正它的方法。
SQL更新:
---------
源表
创建表MY_TABLE (
R_ID int,
R_Site varchar(255),
R_Name varchar(255),
角色varchar(255)
);
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','123,-456,-789 ','qwer','Owner');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','56,-741,-852 ','qaz','Manager');
将逗号分隔的字符串拆分为行后,我希望得到如下表所示的结果
创建表MY_TABLE (
R_ID int,
R_Site varchar(255),
R_Name varchar(255),
角色varchar(255)
);
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 (“1” 、 “123” 、 “qwer” 、“ 所有者 ”);
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','-456,','qwer','Owner');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','-789','qwer','Owner');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','56','qaz','Manager');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','-741','qaz','Manager');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','-852','qaz','Manager');
我能够通过使用常规exp并按级别连接来有效地实现这一目标。但是我想在ASCI标准中有一个解决方案。
提前谢谢。
感谢您将其放入SQL中,以便我们可以使用它。
即使您将版本设置为 “18”,我也将假定这是SQL开发人员版本,因此这里可以在11g中使用。如果您对逗号数的计算错误,则通常会产生旋转查询,因此最终将永远 “连接”。我们可以使用cast/multisset来获取每行 * 的逗号数,以避免这种情况
从那时起,该结果集就像任何其他表一样,因此,如果您想与其他表连接,wave子句将使其保持简单,即
R_ID R_Site R_Name R_Role
-
1 123,-456,-789 qwer所有者
2 56,-741-852 qaz经理
3 369,-741,-987 wsx员工
4所有eddc员工
5名所有rfv员工
并使用下面的查询将R_Site逗号分隔的值转换为行
选择REGEXP_SUBSTR (txt,'[^,]',1,级别) 作为站点,R_NAME
从 (选择不同的R_SITE作为txt,从MY_TABLE中选择R_NAME
按级别连接 <= 长度 (regexp_replace(txt,'[^,] *')) 1
现在,我需要将上述结果集连接到R_SITE(SITE) = S_SITE上的下表,以在最终结果中获取S_Sal值
S_ID s_s_s_mgr
----- ------ -----
1 -789 10000 Raghu
2 -123 20000马赫什
3 -456 300000 Swetha
4 -147 400000 Vamsi
5所有500000纳伦德拉
但是当我加入时,数据库一直在旋转,没有给出任何结果。
您能否让我知道我是否在任何步骤中做错了,以及纠正它的方法。
SQL更新:
---------
源表
创建表MY_TABLE (
R_ID int,
R_Site varchar(255),
R_Name varchar(255),
角色varchar(255)
);
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','123,-456,-789 ','qwer','Owner');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','56,-741,-852 ','qaz','Manager');
将逗号分隔的字符串拆分为行后,我希望得到如下表所示的结果
创建表MY_TABLE (
R_ID int,
R_Site varchar(255),
R_Name varchar(255),
角色varchar(255)
);
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 (“1” 、 “123” 、 “qwer” 、“ 所有者 ”);
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','-456,','qwer','Owner');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('1','-789','qwer','Owner');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','56','qaz','Manager');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','-741','qaz','Manager');
插入到MY_TABLE(R_ID,R_Site,R_Name,R_Role)
值 ('2','-852','qaz','Manager');
我能够通过使用常规exp并按级别连接来有效地实现这一目标。但是我想在ASCI标准中有一个解决方案。
提前谢谢。
感谢您将其放入SQL中,以便我们可以使用它。
即使您将版本设置为 “18”,我也将假定这是SQL开发人员版本,因此这里可以在11g中使用。如果您对逗号数的计算错误,则通常会产生旋转查询,因此最终将永远 “连接”。我们可以使用cast/multisset来获取每行 * 的逗号数,以避免这种情况
SQL> CREATE TABLE MY_TABLE( 2 R_ID int, 3 R_Site varchar(20), 4 R_Name varchar(20), 5 R_Role varchar(20) 6 ); Table created. SQL> INSERT INTO MY_TABLE(R_ID , R_Site , R_Name , R_Role ) 2 VALUES ('1' , '123,-456,-789', 'qwer' , 'Owner'); 1 row created. SQL> INSERT INTO MY_TABLE(R_ID , R_Site , R_Name , R_Role ) 2 VALUES ('2' , '56,-741,-852', 'qaz' , 'Manager'); 1 row created. SQL> select 2 t.r_id, 3 t.r_name, 4 t.r_role, 5 regexp_substr(t.R_Site, '[^,]+', 1, commas.column_value) as site 6 from 7 MY_TABLE t, 8 table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.R_Site, '[^,]+')) + 1) as sys.OdciNumberList)) commas 9 order by 1,2,3,4; R_ID R_NAME R_ROLE SITE ---------- ------------------------------------------------------------ ------------------------------------------------------------ -------------------- 1 qwer Owner -456 1 qwer Owner -789 1 qwer Owner 123 2 qaz Manager -741 2 qaz Manager -852 2 qaz Manager 56 6 rows selected.
从那时起,该结果集就像任何其他表一样,因此,如果您想与其他表连接,wave子句将使其保持简单,即
with my_Results as select t.r_id, t.r_name, t.r_role, regexp_substr(t.R_Site, '[^,]+', 1, commas.column_value) as site MY_TABLE t, table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.R_Site, '[^,]+')) + 1) as sys.OdciNumberList)) commas select ... from my_results,