문제 설명
다른 열의 열에서 누락된 문자 목록을 찾는 방법 (How to find list of missing characters in a column from another column)
테이블이 두 개 있습니다. 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
참조 솔루션
방법 1:
One way is to use a recursive CTE stripping of leftmost char for leftmost char. The get the distinct set of that chars where the char doesn't exist in the set of single chars.
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);
Maybe you can combine the idea of Gordon removing the existing chars with translate()
first with the idea of stripping off the leftmost chars one by one to even get a shortcut without the need of the NOT EXISTS
.
방법 2:
This is only half an answer.
You can remove the unwanted characters by using 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;
You can even aggregate these back together:
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;
(by Carpediem、sticky bit、Gordon Linoff)