SQL에서 "hasChildren" SELECT 문을 구현하는 방법은 무엇입니까?
문제
다음과 같은 테이블이 있다고 가정해 보겠습니다.
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 개의 장소에 저장 될 것이므로 데이터가 일관되지 않을 가능성이 높아집니다. 새 자녀를 삽입하거나 기존 자식을 삭제하거나 자녀의 부모를 업데이트 할 때 마다이 열을 유지해야합니다.