Как найти список пропущенных символов в столбце из другого столбца - PullRequest
0 голосов
/ 30 мая 2019

У меня есть две таблицы.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

Я хочу иметь возможность искать в Tab2.col_2 с помощью Tab_1.col_2 и идентифицировать все отсутствующие символы

Нет доступных условий соединения между этими двумя таблицами.Я попытался вставить каждый символ в Tab_2.col_2, а затем выполнил простую функцию без функции.

Ожидаемый результат:Я ожидаю, что вывод выдаст два символа, отсутствующих в Tab_1.col_2 - T и G в виде двух строк

Output:
T
G

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Одним из способов является использование рекурсивного обрезания 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

Может быть, вы можетеобъединить идею Гордона, удалившего существующие символы с помощью translate(), сначала с идеей убрать крайние левые символы по одному, чтобы даже получить ярлык без необходимости NOT EXISTS.

0 голосов
/ 31 мая 2019

Это только половина ответа.

Вы можете удалить ненужные символы, используя 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...