我有两个桌子。 Tab_1.col_2具有字符,而Tab2.col_2具有字符串
Tab_1
col_1 col_2
1 A
2 B
3 C
4 N
Tab_2
col_1 col_2
101 CCNCCN
102 ABCNSN
103 TABGNN
我希望能够使用Tab_1.col_2搜索Tab2.col_2并识别所有缺少的字符
这两个表之间没有连接条件。我尝试对Tab_2.col_2上的每个字符进行子字符串化,然后执行一个简单的不在功能中。
预期结果:
我希望输出给出Tab_1.col_2中缺少的两个字符-T和G为两行
Output:
T
G
答案 0 :(得分:0)
这只是答案的一半。
您可以使用translate()
select translate(t2.col_2, rem || ' ', ' ')
from (select listagg(col_2, '') within group (order by col_2) as rem
from table_1
) t cross join
table_2 t2;
您甚至可以将这些聚合在一起:
select listagg(translate(t2.col_2, rem || ' ', ' '), '') within group (order by rem)
from (select listagg(col_2, '') within group (order by col_2) as rem
from table_1
) t cross join
table_2 t2;
答案 1 :(得分:0)
一种方法是对最左字符使用递归CTE剥离最左字符。获取该字符的不同集合,而该字符在单个字符集中不存在。
WITH
cte (c, r)
AS
(
SELECT substr(t2.col_2, 1, 1) c,
substr(t2.col_2, 2, length(t2.col_2) - 1) r
FROM tab_2 t2
UNION ALL
SELECT substr(c.r, 1, 1) c,
substr(c.r, 2, length(c.r) - 1) r
FROM cte c
WHERE substr(c.r, 1, 1) IS NOT NULL
)
SELECT DISTINCT
c.c
FROM cte c
WHERE NOT EXISTS (SELECT *
FROM tab_1 t1
WHERE t1.col_2 = c.c);
也许您可以将Gordon的想法首先与translate()
一起删除现有的字符,然后将一个最左边的字符一一剥离,甚至不需要NOT EXISTS
即可获得快捷方式。