如何从另一列中查找一列中缺少字符的列表

时间:2019-05-30 20:37:24

标签: sql oracle plsql

我有两个桌子。 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

2 个答案:

答案 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);

db<>fiddle

也许您可以将Gordon的想法首先与translate()一起删除现有的字符,然后将一个最左边的字符一一剥离,甚至不需要NOT EXISTS即可获得快捷方式。