댓글은 PARENT_COMMENT_ID 의 데이터 값이 0 이며, 이를 NULL 로 해도 상관은 없습니다. NULL 사용시 아래 구분의 WHERE 조건에서 IS NULL 로 교체 하시면 되겠습니다. 대댓글(댓글의 댓글)은 상위 댓글의 COMMENT_ID 값을 저장하게 되는 구조입니다.
네이버 카페나 다음 카페의 댓글 형태도 트리 형태로 구축되어 있습니다. 즉, 최근에 작성한 글이 하단에 위치한 형태입니다.
계층형 테이블
CREATE TABLE [dbo].[EXER_BBS_COMMENT](
[COMMENT_ID] [bigint] NOT NULL,
[PARENT_COMMENT_ID] [bigint] NOT NULL,
[CONTENT] [nvarchar](4000) NOT NULL,
[WRITER] [nvarchar](50) NOT NULL,
PRIMARY KEY CLUSTERED
(
[COMMENT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[EXER_BBS_COMMENT] ADD DEFAULT ((0)) FOR [PARENT_COMMENT_ID]
WITH TREE_QUERY
AS (
SELECT COMMENT_ID,
PARENT_COMMENT_ID,
CONTENT,
CONVERT(VARCHAR(255), COMMENT_ID) sort,
CONVERT(NVARCHAR(255), CONTENT) depth_fullname
FROM EXER_BBS_COMMENT
WHERE PARENT_COMMENT_ID = 0
UNION ALL
SELECT B.COMMENT_ID,
B.PARENT_COMMENT_ID,
B.CONTENT,
CONVERT(VARCHAR(255), CONVERT(NVARCHAR, C.sort) + N' > ' + CONVERT(VARCHAR(255), B.COMMENT_ID)) sort,
CONVERT(NVARCHAR(255), CONVERT(NVARCHAR, C.depth_fullname) + N' > ' + CONVERT(NVARCHAR(255), B.CONTENT)) depth_fullname
FROM EXER_BBS_COMMENT B,
TREE_QUERY C
WHERE B.PARENT_COMMENT_ID = C.COMMENT_ID
)
SELECT COMMENT_ID,
PARENT_COMMENT_ID,
CONTENT,
depth_fullname,
sort
FROM TREE_QUERY
ORDER BY sort