SQL查询使用in值连接2个表,使用逗号拆分
我有两个有值的表 主表SQL查询使用in值连接2个表,使用逗号拆分,sql,oracle,Sql,Oracle,我有两个有值的表 主表 id refer_id value1 value2 1 C_1,C_2 x y 2 C_3,C_4 Z W 3 C_6 O P 4 C_4,C-2 Q R 5 C_1,C-3 S T 辅助表 id value3 C_1 A C_2 B C_3 C C_4 D C_5 E C-6 F 在这里,我应该组合这两个表,使用主表的refere_id,并将其引用到辅助表,以获
id refer_id value1 value2
1 C_1,C_2 x y
2 C_3,C_4 Z W
3 C_6 O P
4 C_4,C-2 Q R
5 C_1,C-3 S T
辅助表
id value3
C_1 A
C_2 B
C_3 C
C_4 D
C_5 E
C-6 F
在这里,我应该组合这两个表,使用主表的refere_id,并将其引用到辅助表,以获得如下值
value1 value2 value3
X Y A
X Y B
Z W C
Z W D
O P F
Q R D
Q R B
我使用下面的查询来获取distinct并从主表中拆分refereu id,但我不知道如何检索它
从辅助表
distinct(TRIM(regexp_substr(refer_id,'[^,]+', 1, level))) from Master_table connect by regexp_substr(refer_id, '[^,]+', 1, level) is not null;
Oracle安装程序:
CREATE TABLE Master_table ( id, refer_id, value1, value2 ) AS
SELECT 1, 'C_1,C_2', 'x', 'y' FROM DUAL UNION ALL
SELECT 2, 'C_3,C_4', 'Z', 'W' FROM DUAL UNION ALL
SELECT 3, 'C_6', 'O', 'P' FROM DUAL UNION ALL
SELECT 4, 'C_4,C_2', 'Q', 'R' FROM DUAL UNION ALL
SELECT 5, 'C_1,C_3', 'S', 'T' FROM DUAL;
CREATE TABLE Secondary_table ( id, value3 ) AS
SELECT 'C_1', 'A' FROM DUAL UNION ALL
SELECT 'C_2', 'B' FROM DUAL UNION ALL
SELECT 'C_3', 'C' FROM DUAL UNION ALL
SELECT 'C_4', 'D' FROM DUAL UNION ALL
SELECT 'C_5', 'E' FROM DUAL UNION ALL
SELECT 'C_6', 'F' FROM DUAL;
SELECT value1, value2, value3
FROM master_table m
INNER JOIN
secondary_table s
ON ( ',' || m.refer_id || ',' LIKE '%,' || s.id || ',%' );
VALUE1 VALUE2 VALUE3
------ ------ ------
x y A
x y B
Z W C
Z W D
O P F
Q R B
Q R D
S T A
S T C
查询:
CREATE TABLE Master_table ( id, refer_id, value1, value2 ) AS
SELECT 1, 'C_1,C_2', 'x', 'y' FROM DUAL UNION ALL
SELECT 2, 'C_3,C_4', 'Z', 'W' FROM DUAL UNION ALL
SELECT 3, 'C_6', 'O', 'P' FROM DUAL UNION ALL
SELECT 4, 'C_4,C_2', 'Q', 'R' FROM DUAL UNION ALL
SELECT 5, 'C_1,C_3', 'S', 'T' FROM DUAL;
CREATE TABLE Secondary_table ( id, value3 ) AS
SELECT 'C_1', 'A' FROM DUAL UNION ALL
SELECT 'C_2', 'B' FROM DUAL UNION ALL
SELECT 'C_3', 'C' FROM DUAL UNION ALL
SELECT 'C_4', 'D' FROM DUAL UNION ALL
SELECT 'C_5', 'E' FROM DUAL UNION ALL
SELECT 'C_6', 'F' FROM DUAL;
SELECT value1, value2, value3
FROM master_table m
INNER JOIN
secondary_table s
ON ( ',' || m.refer_id || ',' LIKE '%,' || s.id || ',%' );
VALUE1 VALUE2 VALUE3
------ ------ ------
x y A
x y B
Z W C
Z W D
O P F
Q R B
Q R D
S T A
S T C
输出:
CREATE TABLE Master_table ( id, refer_id, value1, value2 ) AS
SELECT 1, 'C_1,C_2', 'x', 'y' FROM DUAL UNION ALL
SELECT 2, 'C_3,C_4', 'Z', 'W' FROM DUAL UNION ALL
SELECT 3, 'C_6', 'O', 'P' FROM DUAL UNION ALL
SELECT 4, 'C_4,C_2', 'Q', 'R' FROM DUAL UNION ALL
SELECT 5, 'C_1,C_3', 'S', 'T' FROM DUAL;
CREATE TABLE Secondary_table ( id, value3 ) AS
SELECT 'C_1', 'A' FROM DUAL UNION ALL
SELECT 'C_2', 'B' FROM DUAL UNION ALL
SELECT 'C_3', 'C' FROM DUAL UNION ALL
SELECT 'C_4', 'D' FROM DUAL UNION ALL
SELECT 'C_5', 'E' FROM DUAL UNION ALL
SELECT 'C_6', 'F' FROM DUAL;
SELECT value1, value2, value3
FROM master_table m
INNER JOIN
secondary_table s
ON ( ',' || m.refer_id || ',' LIKE '%,' || s.id || ',%' );
VALUE1 VALUE2 VALUE3
------ ------ ------
x y A
x y B
Z W C
Z W D
O P F
Q R B
Q R D
S T A
S T C
或者您可以使用集合:
Oracle安装程序:
CREATE TABLE Master_table ( id, refer_id, value1, value2 ) AS
SELECT 1, 'C_1,C_2', 'x', 'y' FROM DUAL UNION ALL
SELECT 2, 'C_3,C_4', 'Z', 'W' FROM DUAL UNION ALL
SELECT 3, 'C_6', 'O', 'P' FROM DUAL UNION ALL
SELECT 4, 'C_4,C_2', 'Q', 'R' FROM DUAL UNION ALL
SELECT 5, 'C_1,C_3', 'S', 'T' FROM DUAL;
CREATE TABLE Secondary_table ( id, value3 ) AS
SELECT 'C_1', 'A' FROM DUAL UNION ALL
SELECT 'C_2', 'B' FROM DUAL UNION ALL
SELECT 'C_3', 'C' FROM DUAL UNION ALL
SELECT 'C_4', 'D' FROM DUAL UNION ALL
SELECT 'C_5', 'E' FROM DUAL UNION ALL
SELECT 'C_6', 'F' FROM DUAL;
SELECT value1, value2, value3
FROM master_table m
INNER JOIN
secondary_table s
ON ( ',' || m.refer_id || ',' LIKE '%,' || s.id || ',%' );
VALUE1 VALUE2 VALUE3
------ ------ ------
x y A
x y B
Z W C
Z W D
O P F
Q R B
Q R D
S T A
S T C
用于将字符串拆分为分隔值的简短帮助器类型和函数:
CREATE TYPE stringlist IS TABLE OF VARCHAR2(4000);
/
CREATE FUNCTION split_String(
i_str IN VARCHAR2,
i_delim IN VARCHAR2 DEFAULT ','
) RETURN stringlist DETERMINISTIC
AS
p_result stringlist := stringlist();
p_start NUMBER(5) := 1;
p_end NUMBER(5);
c_len CONSTANT NUMBER(5) := LENGTH( i_str );
c_ld CONSTANT NUMBER(5) := LENGTH( i_delim );
BEGIN
IF c_len > 0 THEN
p_end := INSTR( i_str, i_delim, p_start );
WHILE p_end > 0 LOOP
p_result.EXTEND;
p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, p_end - p_start );
p_start := p_end + c_ld;
p_end := INSTR( i_str, i_delim, p_start );
END LOOP;
IF p_start <= c_len + 1 THEN
p_result.EXTEND;
p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, c_len - p_start + 1 );
END IF;
END IF;
RETURN p_result;
END;
/
(与上面的输出相同。)速度较慢,但您可以使用通配符加入。e、 g.在Master_table.reference_id像“%”+Secondary_table.id“%”谢谢,按预期完善它的工作。我使用了第一种方法,而不是使用函数。