편집 :
내가 지금 알아 낸 것 같아요
WITH children AS (
SELECT id, parent_id
FROM inventory
WHERE id = 0
UNION ALL
SELECT a.id , a.parent_id
FROM inventory a
JOIN children b ON b.parent_id = a.id
)
SELECT id, parent_id
FROM children
는 다음과 같은 작업 코드가 어떻게 표시되는지를 보여줍니다. CTE의 rowNum
은 최종 선택에서 레코드를 정렬하는 데 사용됩니다.
;WITH children AS (
SELECT DISTINCT id, parent_id, rowNum = ROW_NUMBER() OVER (ORDER BY id ASC)
FROM inventory
WHERE parent_id = 0
UNION ALL
SELECT a.id , a.parent_id, b.rowNum
FROM inventory a
JOIN children b ON a.parent_id = b.id
WHERE a.parent_id <> 0
)
SELECT id, parent_id
FROM children
ORDER BY rowNum, id
질문에서 전체 쿼리를 사용하여 두 번째 편집 :
이 dateOn에 정렬을, 당신은 단지 ORDER BY
조항의 시작 부분에 추가 할 것입니다. 그럼 당신이와 끝까지 :
;WITH cte AS (
SELECT DISTINCT id, parent_id, dateOn, capacity, status, instructorID, rowNum = ROW_NUMBER() OVER (ORDER BY id ASC)
FROM inventory
WHERE parent_id = 0 AND active='True' AND cID=1
UNION ALL
SELECT a.id, a.parent_id, a.dateOn, a.capacity, a.status, a.instructorID, b.rowNum
FROM inventory a
JOIN cte b ON a.parent_id = b.id
WHERE a.parent_id <> 0 AND active='True' AND cID=1
)
SELECT id, parent_id, dateOn, capacity, status, (SELECT count(aID) FROM appointments WHERE id=cte.id) as totalCount
FROM cte
ORDER BY dateOn, rowNum, id
가의가에 무슨 일이 일어나고 있는지 확인하기 위해 쿼리를 분해하자 다음 CTE의
'앵커'이것은 모두를 얻고있다
SELECT DISTINCT id, parent_id, dateOn, capacity, status, instructorID, rowNum = ROW_NUMBER() OVER (ORDER BY id ASC)
FROM inventory
WHERE parent_id = 0 AND active='True' AND cID=1
한다 부모 레코드가 inventory
이고 마지막 선택에서 정렬을 위해 부모와 모든 자식을 연결하는 데 사용할 수있는 rownumber를 추가합니다.
열팽창 계수의 재귀 부분 cte
앵커 쿼리 학부모 레코드 재귀 참조 인 쿼리의 일부
SELECT a.id, a.parent_id, a.dateOn, a.capacity, a.status, a.instructorID, b.rowNum
FROM inventory a
JOIN cte b ON a.parent_id = b.id
WHERE a.parent_id <> 0 AND active='True' AND cID=1
이다. 그래서 우리는 부모 레코드가 아닌 부모 레코드를 부모 레코드에 결합합니다. 우리는 부모의 rowNum
을 사용하므로 부모와 자식 모두이 필드에 대해 동일한 값을 갖습니다.
그런 다음 최종 SELECT 문은 CTE에서 모든 행을 반환합니다. dateOn
으로 먼저 주문하므로 동일한 dateOn
을 공유하는 모든 상위/하위 레코드가 함께 표시됩니다. 다음으로 우리는 rowNum
으로 주문하므로 각 부모는 그 자녀들과 함께있을 것입니다. 마지막으로, 부모가 자녀보다 작은 id
값을 가질 것이라고 가정하고 id
을 정렬합니다.부모가 더 큰 id
을 가지면, 우리는 parent_id
대신에 주문할 수 있습니다. 따라서 부모 레코드 (parent_id = 0
포함)가 자녀보다 먼저 나타납니다.
이것을 인접 목록이라고합니다. 그것은 이와 같이 데이터를 저장하는 매우 일반적인 방법입니다. 당신이 원하는 것을하기위한 기술은 순환적인 cte라고 불립니다. 말 그대로 수천, 수천, 수천 가지의 예가이 사이트와 인터넷의 나머지 부분에서이 작업을 수행하는 방법입니다. –
이 응답에 감사드립니다. 나는 주변을 둘러보고 내가 무엇을 찾을 수 있는지 알아볼 것입니다. – Damien
어떤 단어를 찾을 지 모를 때 때로는 대답을 찾기가 어렵습니다. –