Hierarchical Queries: Databases for Developers #16

나무 그들은 자연의 모든 곳에 있습니다

그러나 그들은 또한 귀하의 데이터에서 흔히 볼 수 있습니다 예 : 회사의 계층 구조 또는 가계도 하지만 이것들을 저장할 때 데이터베이스의 계층 구조를 사용하면 각 행이 트리에서 어디에 적합한 지 알 수 없습니다 운 좋게 필요한 것은 행을 나무로 바꾸는 약간의 SQL 마법입니다! 그것은 당신의 사랑스런 할머니의 생일이 다가오고 있습니다 너를 축하하기 위해 모든 자녀를 보여주는 가계도를 그려야한다

너의 부모, 아줌마, 그리고 삼촌; 자녀, 당신, 형제, 사촌들; 그들의 아이들 등등 에 이 기능을 사용하면 데이터베이스 테이블에 저장된 모든 가족 구성원의 세부 정보를 얻을 수 있습니다 그러나 이것에 대한 표준 쿼리를 실행하면 분명하지 않습니다 세대마다, 부모는 누구인가 너는 주변에 얻을 수 있는다

이것은 테이블 자체에 가입함으로써 새로운 세대마다 계속해서 또 다시 그러나 이것은 쓸 페인트입니다 그리고, 만약 당신이 당신의 가족을 다시 그리기 원한다면 위대한 위대한 위대한 위대한 위대한 할머니, 당신은 SQL 쿼리를 다시 작성해야합니다 너는 할 수있다 계층 적 연산자를 사용하여 이러한 문제를 극복합니다

하지만 우리 전에 SQL에 뛰어 들어라, 약간의 용어 실세계에서 나무는 뿌리부터 시작합니다 잎으로 자랍니다 데이터 트리가 동일합니다 출발점은 뿌리, 잎 끝

사이의 각 점은 노드입니다 그리고, 가계도처럼, 노드의 직접적인 상위 노드는 부모 노드이며 직접 자손 노드입니다 어린이 루트는 부모가없는 노드이고 리프는 자식이없는 노드입니다 SQL로 돌아 가기! 쿼리를 작성하려면 행을 식별하는 방법을 알아야합니다

부모와 부모 사이의 관계가 뿌리와 열에 어린이 할머니가 나무의 시작입니다 그래서 그녀는 뿌리입니다 그리고 부모와 자녀 사이의 관계는 실생활과 같습니다 그만큼 각 사람의 어머니 또는 아버지는 그 자녀의 부모입니다

이 무장 한 이제 Oracle Database에서 SQL 쿼리를 작성하기 시작할 수 있습니다 그러나 먼저 독점적 인 my 절 연결을 선택해야합니다 또는 ANSI 호환 재귀 적 두 경우 모두 당신의 할머니와 함께 시작하고 싶습니다 시작 부분에 그녀를 선택하여 연결하십시오

함께 사용하면 이 행을 얻기 위해 정상적인 선택을하십시오 실생활 에서처럼 각 사람의 부모는 이전 세대의 어머니 또는 아버지 그래서 이것들을 확인해야합니다 이전 레벨의 가족 구성원에 대한 열 Oracle 구문 사용 PRIOR 키워드를 사용하여 액세스 할 수 있습니다

따라서 connect by 절에서 이전 사람이 현재의 어머니 또는 아버지와 일치하는지 확인하십시오 재귀 적 더 복잡합니다 모든 하위 쿼리를 초기 쿼리와 통합해야합니다 너 할머니를 데려와 그런 다음 이것을 원래 패밀리 테이블에 다시 결합합니다

하위 쿼리의 사람이 어머니 또는 아버지와 일치합니다 이 시점에서 두 가지 방법 모두 트리를 만들었습니다 그러나 방금 선택한 것과 같은 결과가 나타납니다 테이블에서 어떤 행이 자식인지, 손자인지, 또는 증손자

이것을 보여주기 위해 각각의 세대를 추가해야합니다 사람이 속하고 행을 적절하게 들여 씁니다 여기에 연결하면 쉬운 의사 – 열 수준은 당신이 계층에있는 위치를 보여줍니다 이 1에서 시작한 다음 트리에서 새 하위 세트 각각에 대해 증가합니다 할머니가 1 단계에 있습니다

부모님, 숙모, 삼촌이 2 단계입니다 당신, 형제 자매 및 사촌은 3 급입니다 그런 다음이 패드를 사용하여 이름 앞에 공백이 있으므로 각 세대에 누가 있는지 쉽게 볼 수 있습니다 재귀 적으로는 레벨 함수가 내장되어 있지 않습니다 그러나 이것은 쉽습니다

수동으로하기에 충분합니다 기본 쿼리에서 레벨을 하나 선택하십시오 그런 다음 재귀 부분에서 레벨을 증가시킵니다 이름 앞에 공백을 추가하십시오 이제 각 세대가 어느 세대에 속하는지 쉽게 알 수 있습니다

그러나 그 순서는 다소 혼란 스러울 수 있습니다 보통 형제를 가장 오래된 것부터 가장 어린 것까지 정렬하고 모든 트리에서 그들 옆에있는 사람의 자녀들 그리고 연결을 통해 큰 장점으로 재귀 적으로 여기 있습니다 너는 할 수있다 나무를 걸어 내려고하는 방법을 지정하십시오

깊이 우선 또는 너비 우선 깊이 우선 검색을 사용하면 루트에서 시작한 다음까지 계속 진행합니다 너는 잎을 친다 그런 다음 다시 올라가서 아이가없는 노드를 찾을 때까지갑니다 전에 방문했다

당신이 다음 잎을 찾을 때까지 그걸 따라 가라 그래서 가능한 한 멀리 내려가는거야 반면에 너비 우선 검색은 동일한 레벨의 모든 노드를 방문하여 다음 노드로 이동합니다 그래서 그것은 당신의 할머니와 함께 시작됩니다 그런 다음 모든 자녀를 갖습니다

너의 부모, 아줌마, 그리고 삼촌 그런 다음 모든 자녀들 등등 이 검색 유형은 얼마나 빨리 영향을 미칠 수 있습니다 SQL이 실행되거나 쿼리가 작동하는 방식도 포함됩니다 하지만 지금은 결과를 정렬하는 방법을 지정하십시오 가장 나이 많은 아이들을 먼저 보여주기 위해, 즉시 자녀가 따라 다니며 생년월일 순으로 심층 검색을 원합니다

이 작업을 재귀 적으로 사용하면 하위 쿼리 다음에이 작업을 반복하는 것이 쉽습니다 또한 데이터베이스가 방문하는 순서를 표시하는 열을 정의해야합니다 행 이것은 set 절에 들어갑니다 행 표시를 보장하려면 이 순서는에 의해 당신의 순서에있는이 란을 둔다

슬프게도 연결할 수 없다 트리 검색 방법을 지정하는 옵션 행에 그것들에 접근하는 순서 순서를 추가하면이 순서가 파기됩니다 다행히도 order by는 형제 조항을 가지고 있습니다

동일한 세대의 행을 표시합니다 따라서 동일한 효과를 얻으려면 생년월일까지 형제 자매를 주문하십시오 이제는 할머니의 피를 모두 보여주는 가계도를 만들었습니다 자손 그러나 실제 가계도에는 보통 모든 부모가 포함됩니다

어린이 이렇게하면 SQL에 많은 복잡성이 추가됩니다 예를 들어, if 할아버지를 뿌리로 삼아 가계도를 두 번 세우고, 가족 모두를 복제합니다 이는 데이터 용어로 각 노드 나무에는 하나의 부모가 있습니다 그러나 물론, 실생활에는 모두 2 명입니다

부모님 그래서 가계도는 실제 나무가 아닙니다 이것은 지시 된 비순환 그래프입니다! SQL을 사용하여 가계도를 그리려는 경우이 점을 명심하십시오 너는 자손들, 예를 들면 어머니들, 한 성별로 가장 잘 벗어남 아버지와 합당하게 합류했다

그래서 우리는 당신의 가계도를 만들었습니다 그러나 우리가 덮을 필요가있는 나무의 중요한 측면 중 하나가 여전히 있습니다 루프! 우리가 시간 여행을 발견하지 못하면 자신의 조상이된다는 것은 불가능합니다 그래서 당신은 할 수 없습니다 패밀리 트리에 루프가있다

그러나 다른 데이터 구조에서도 가능합니다 계층 구조에 루프가 존재한다면, 루프를 따라 가면 결국 얻을 수 있습니다 무한 루프에 갇혀있다 다행히도 데이터베이스가이를 감지 할 수 있습니다 쿼리를 중지하십시오

불행하게도 오류가 발생하면 오류가 발생하여 결과가 없습니다 주기 감지를 사용하여이 문제를 피할 수 있습니다 연결 대상 : 연결 후 nocycle 키워드를 추가하면 Oracle Database가 보석을받습니다 그것이 같은 줄로 돌아 오면 밖으로 나가십시오 ANSI 스타일을 사용하여 동일하게 수행하는 것은 입력뿐만 아니라 더 많은 힘을! 예를 들어 벽돌을 배열했다고 가정 해 보겠습니다

상단에서 가장 크고 하단에서 가장 작은 트리 하지만 너는 실수로 잎 중 하나가 트리의 다른 지점으로 향하게됩니다 루프가 없습니다 하지만이 노드에는 두 개의 부모가 있습니다 그래서 당신이 나무 아래로 걸어 두 번 도달하게됩니다

즉,이 모든 벽돌을 두 장 복사하면됩니다 결과 당신이 피하고 싶은 것 벽돌이 점점 작아지는 것을 알 수 있습니다 나무

따라서 경로에서 본 것과 같은 크기의 벽돌을 보았다면 지금까지 문제가 있습니다 cycle 절을 사용하면이를 감지하고 처리를 중지 할 수 있습니다 사이클 절을 사용하려면 검사 할 열을 나열하십시오 중복 그런 다음 데이터베이스가 표시 될 때 설정할 값이있는 새 열을 정의합니다

반복되는 값 기본값이 아닌 경우 기본값 그래서 SQL을 사용하여 계층 구조를 만드는 방법에 대한 간략한 개요였습니다 연결하는 데 사용할 수있는 많은 기능이 있습니다 행은 나뭇잎 또는 행의 조상입니다

의 링크를 확인하십시오 자세한 설명 및 이러한 함수를 에뮬레이션하는 방법 재귀 적 그냥 기억하십시오 : 나무를 건축 할 때 루프와 뿌리를 정의하십시오 그렇지 않으면 테이블의 모든 행에 대해 새 트리를 만듭니다! 보고 주셔서 감사합니다! 당신이 이것을 즐기고 더 많이보고 싶다면 SQL 비디오가 지금 화면의 링크를 클릭합니다