SQLite3의 재귀 쿼리: 복잡한 계층적 데이터 관계 해결
널리 사용되는 데이터베이스 엔진인 SQLite3은 전통적으로 재귀 쿼리에 대한 지원이 부족했습니다. 계층적 데이터 구조를 다룰 때 문제가 발생합니다. 그러나 SQLite 3.8.3에 CTE(공용 테이블 표현식)가 도입되면서 사용자는 재귀 쿼리를 실행할 수 있게 되었습니다.
재귀 쿼리 예
다음 구조를 갖는 "Part"라는 테이블:
Table: Part Part SuperPart wk0Z wk00 wk06 wk02 wk07 wk02 eZ01 eZ00 eZ02 eZ00 eZ03 eZ01 eZ04 eZ01
주어진 항목의 모든 쌍을 찾으려면 하위 파트가 포함된 "SuperPart"에는 재귀 쿼리가 필요합니다. 예를 들어 "SuperPart" eZ00의 경우 쿼리는 (eZ00, eZ01), (eZ01, eZ03) 및 (eZ00, eZ03)과 같은 쌍을 반환해야 합니다.
재귀 CTE 사용
SQLite 3.8.3부터 재귀적 이러한 쿼리에는 CTE를 사용할 수 있습니다. 다음 쿼리는 CTE를 활용하여 원하는 결과를 얻습니다.
WITH RECURSIVE subParts AS ( SELECT Part, SuperPart FROM Part WHERE SuperPart = :superPart UNION ALL SELECT p.Part, p.SuperPart FROM Part AS p JOIN subParts AS sp ON p.SuperPart = sp.Part ) SELECT Part, SuperPart FROM subParts;
이 쿼리는 "subParts"라는 CTE를 사용하여 지정된 "SuperPart"의 모든 하위 부분을 반복적으로 찾습니다. 재귀적 "UNION ALL" 절을 사용하면 CTE가 자체 조인을 통해 계층 구조를 순회하고 필요한 쌍을 수집할 수 있습니다.
클라이언트 코드 재귀 사용
CTE 지원이 부족한 3.8.3 이전 SQLite 버전의 경우 클라이언트 코드 재귀를 사용해야 합니다. 여기에는 더 이상 데이터가 반환되지 않을 때까지 행과 하위 부분 ID를 수동으로 검색하는 작업이 포함됩니다. 다음 스니펫은 이 접근 방식을 보여줍니다.
# Recursive helper function def get_subparts(superPart): # Get initial row and sub-part IDs row = select_one("SELECT Part, SuperPart FROM Part WHERE SuperPart = ?", (superPart,)) if not row: return # Yield current sub-part yield row['Part'] # Recursively get sub-parts of sub-parts for subPart in get_subparts(row['Part']): yield subPart # Iterate over sub-parts using client-code recursion for subPart in get_subparts("eZ00"): print(subPart)
위 내용은 SQLite3의 재귀 쿼리는 어떻게 복잡한 계층적 데이터 관계를 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!