SQL에서 "hasChildren" SELECT 문을 구현하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1805671

  •  05-07-2019
  •  | 
  •  

문제

다음과 같은 테이블이 있다고 가정해 보겠습니다.

ID | parentID | MoreStuff
1  | -1       |  ...
2  |  1       |  ...
3  |  1       |  ...
4  |  2       |  ...
5  |  1       |  ...

특정 행에 하위 항목이 있는지 확인하기 위해 SQL SELECT 문을 생성하려면 어떻게 해야 합니까?즉, ID 1에 자식이 있는지 알고 싶습니다. 이 경우에는 3이 있습니다.

SQL 문을 만드는 방법을 잘 모르겠습니다.

SELECT ID, hasChildren FROM myTable;

위의 SQL SELECT 문에서 hasChildren을 무엇으로 바꾸나요?

도움이 되었습니까?

해결책

그룹 버전 없음 :

SELECT MyTable.Id, CASE WHEN EXISTS 
    (SELECT TOP 1 1  --you can actually select anything you want here
     FROM MyTable MyTableCheck 
     WHERE MyTableCheck.ParentId = MyTable.Id
    ) THEN 1 ELSE 0 END AS HasRows
FROM MyTable

다른 팁

테이블 자체에 조인하여 하위 항목이 있는지 확인합니다.

SELECT 
    parent.id as ID
,   case when count(child.id) > 0 then 1 else 0 end as hasChildren 
FROM       myTable parent
LEFT JOIN  myTable child
ON         child.parentID = parent.ID
GROUP BY   parent.id

부모 ID를 이미 알고 있다면 쿼리는 간단합니다. 부모 ID로 행 수를 선택하십시오.

SELECT count(*) FROM myTable where parentID = 1;

귀하의 질문에 대한 매우 유효한 답변이 작동합니다. 그러나 데이터 세트가 매우 큰 경우 이러한 쿼리의 성능을 고려할 것입니다.

데이터를 얻기 위해 그룹 또는 하위 쿼리를 사용하려면 ID와 상위 열에 별도의 인덱스가 있는지 확인하십시오.

더 나은 성능을 얻으려면 "비트"데이터 유형이 될 수있는 "해저"라는 열을 추가해야합니다. 그런 다음이 열은 항목이 삽입되거나 삭제되면 응용 프로그램 코드에서 업데이트되어야합니다. 이렇게하면 훨씬 빠른 쿼리를 실행할 수 있습니다.

SELECT * FROM table WHERE haschildren IS NOT NULL

위의 솔루션은 괜찮지 만 실제로 성능 문제가 없다면 '해산 자'와 같은 열을 추가해서는 안됩니다 (Gatekiller의 게시물 참조). 이러한 열은 데이터베이스를 제거하고, 즉 동일한 정보는 2 개의 장소에 저장 될 것이므로 데이터가 일관되지 않을 가능성이 높아집니다. 새 자녀를 삽입하거나 기존 자식을 삭제하거나 자녀의 부모를 업데이트 할 때 마다이 열을 유지해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top