도전 과제:
두 개의 테이블이 주어지고 하나는 쉼표로 구분된 데이터가 있습니다. 열에서 작업은 테이블에서 데이터를 검색하고 결과를 쉼표로 구분된 값으로 표시하는 것입니다. 각 행에 대해 단일 문자열로 결합됩니다.
정규화:
이상적인 접근 방식은 쉼표를 사용하여 테이블을 정규화하는 것입니다. -분리된 데이터 열로 복잡한 문자열 조작이 필요하지 않습니다. 쉼표로 구분된 각 값이 새 행이 되는 새 테이블을 생성하면 공통 필드에서 테이블을 쉽게 조인할 수 있습니다.
분할 함수:
If 정규화가 불가능하면 쉼표로 구분된 값을 결합할 수 있는 행으로 변환하는 분할 함수를 만들 수 있습니다. 그런 다음 이 함수를 사용하여 데이터를 여러 행에 남겨두거나 값을 다시 쉼표로 구분된 목록으로 연결할 수 있습니다.
XML PATH 및 STUFF의 경우:
또는 FOR XML PATH 및 STUFF 기술을 사용하여 데이터를 검색할 수 있습니다. FOR XML PATH는 쉼표로 구분된 값을 XML로 변환하고 STUFF를 사용하여 XML을 단일 문자열로 연결할 수 있습니다.
직접 FOR XML PATH 애플리케이션:
마지막 접근 방식은 FOR XML PATH를 데이터 열에 직접 적용하는 것입니다. 원하는 열을 선택하고 적절한 쿼리를 사용하면 쉼표로 구분된 값을 검색하여 단일 문자열로 집계할 수 있습니다.
선택한 접근 방식에 따라 구현이 달라집니다. 달라질 것입니다. 다음 예는 각 방법을 구현할 수 있는 방법에 대한 간략한 개요를 제공합니다.
정규화:
CREATE TABLE NormalizedTable ( id INT, value VARCHAR(255), ); INSERT INTO NormalizedTable (id, value) VALUES (1, 'john'), (2, 'alex'), (3, 'piers'), (4, 'sara'), (5, 'C1'), (6, 'C2'), (7, 'C3'), (8, 'C4'), (9, 'R1'), (10, 'R2'), (11, 'R3'); SELECT DISTINCT T2.col1, STUFF(( SELECT ', ' + T1.col2 FROM NormalizedTable T1 INNER JOIN Table2 T2 ON T1.id = T2.col2 FOR XML PATH('') ), 1, 2, '');
분할 함수:
CREATE FUNCTION dbo.Split (@String VARCHAR(MAX), @Delimiter CHAR(1)) RETURNS TABLE AS RETURN WITH CTE AS ( SELECT 1 AS RowNum, @String AS Value UNION ALL SELECT RowNum + 1, SUBSTRING(@String, RowNum + 1, LEN(@Delimiter)) FROM CTE WHERE SUBSTRING(@String, RowNum + 1, LEN(@Delimiter)) <> '' ) SELECT RowNum, Value AS Item FROM CTE; -- Usage SELECT DISTINCT T2.col1, STUFF(( SELECT ', ' + T1.col2 FROM ( SELECT DISTINCT Value AS col2 FROM dbo.Split(T2.col2, ',') ) T1 FOR XML PATH('') ), 1, 2, '');
XML 경로 및 내용:
SELECT T2.col1, ( SELECT ', ' + T1.col2 FROM Table1 T1 WHERE ',' + T2.col2 + ',' LIKE '%,' + CAST(T1.col1 AS VARCHAR(10)) + ',%' FOR XML PATH('') ).value('substring(text()[1], 3)', 'VARCHAR(MAX)') AS col2 FROM Table2 T2;
적절한 접근 방식을 선택하고 필요한 코드를 구현하면 쉼표로 구분된 데이터를 테이블의 각 행에 대해 단일 문자열로 효과적으로 결합할 수 있습니다.
위 내용은 SQL에서 쉼표로 구분된 데이터 열을 조인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!