2017-12-21 26 views
0

부모와 자식을 모두 포함하는 테이블이 있습니다. 지금, 나는 테이블에 전화를 분리 할 수 ​​있습니다 :SQL을 사용하여 부모 및 자식이 모두 같은 테이블에있는 자식을 가져옵니다.

Select * FROM inventory WHERE subID=0 // parents 

루프

Select * from inventory where subID=parentID 

내 질문은 부모를, 부모를 잡고 SQL 문 아이들을 형성하는 방법이 그 그것에 속해서 ..

//SQL Results would look like this 
Parent 
- Child 
- Child 
Parent 
- Child 
- Child 
- Child 
etc.. 

감사합니다, 정말로 고마워요!

** 업데이트 ** 이제이 내용이 무엇인지 알았으니 여기에 시도하겠습니다.하지만 결과가 없습니다. id = 0은 그것이 부모임을 나타냅니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

;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 rowNum, id 
+2

이것을 인접 목록이라고합니다. 그것은 이와 같이 데이터를 저장하는 매우 일반적인 방법입니다. 당신이 원하는 것을하기위한 기술은 순환적인 cte라고 불립니다. 말 그대로 수천, 수천, 수천 가지의 예가이 사이트와 인터넷의 나머지 부분에서이 작업을 수행하는 방법입니다. –

+0

이 응답에 감사드립니다. 나는 주변을 둘러보고 내가 무엇을 찾을 수 있는지 알아볼 것입니다. – Damien

+0

어떤 단어를 찾을 지 모를 때 때로는 대답을 찾기가 어렵습니다. –

답변

1

편집 :

내가 지금 알아 낸 것 같아요

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 포함)가 자녀보다 먼저 나타납니다.

+0

흠 ... 나는 그것을 시도하고 마침내 몇 가지 결과를 얻었지만 부모님 만 돌려 줬다. 그래서 parent_id where 절을 제거하고 이제는 모든 것을 제공하지만 정보는 꺼져 있습니다 ... 부모를 반복해서 반복하여 자녀를 나열하지 않습니다. \ – Damien

+0

@Damien, 올바른 쿼리로 내 대답을 업데이트했습니다. –

+0

와우! 두 가지, 쿼리에 필요한 모든 것을 포함하도록 코드를 업데이트했습니다. 어떻게 날짜순으로 주문합니까? 더구나, 이것은 그 dateOn 부분 외에 꽤 잘 작동하는 것처럼 보였다. 당신이 한 일을 설명해 주시겠습니까? 나는 앞으로 이것을 배울 수 있습니다. 더미로 부셔 라. – Damien