Thinking of a slightly forward approach, I thought that maybe you want to work with a framework that allows you to have "grandchildren" of your posts. For this I did the following script
insertion:
CREATE TABLE autor(
id_autor INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
nome VARCHAR(100)
);
go
CREATE TABLE postagem(
id_postagem INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
titulo VARCHAR(100),
id_autor INT,
postagem_pai INT,
CONSTRAINT fk_postagem_autor FOREIGN KEY (id_autor) REFERENCES autor (id_autor),
CONSTRAINT fk_postagem_postagem FOREIGN KEY (postagem_pai) REFERENCES postagem (id_postagem)
);
go
-- Inserções
DECLARE @id_autor INT,
@postagem_pai INT;
-- Insere os autores
INSERT INTO autor(nome)
VALUES('Autor01');
SET @id_autor = SCOPE_IDENTITY();
INSERT INTO autor(nome)
VALUES('Autor02');
-- Insere o pai
INSERT INTO postagem(titulo, id_autor)
VALUES('post_pai', @id_autor);
SET @postagem_pai = SCOPE_IDENTITY();
-- Insere filhos
INSERT INTO postagem(titulo, id_autor, postagem_pai)
VALUES('post_filho1', @id_autor, @postagem_pai),
('post_filho2', @id_autor, @postagem_pai),
('post_filho3', @id_autor, @postagem_pai);
SET @postagem_pai = SCOPE_IDENTITY();
-- Insere netos
INSERT INTO postagem(titulo, id_autor, postagem_pai)
VALUES('post_neto3.1', @id_autor, @postagem_pai)
go
Which produces the following result:
Authoring table
Postingtable
UsingWITH
SotoproducetheselectionofallpostsIusedtheexpressionWITH
ofSQLServer
.
Specifiesatemporarynamedresultset,knownasacommontableexpression(CTE).Itisderivedfromasimple,definedqueryintheexecutionscopeofasingleSELECT,INSERT,UPDATE,orDELETEstatement.ThisclausecanalsobeusedinaCREATEVIEWstatementaspartoftheSELECTstatementthatdefinesit.Acommontableexpressionmayincludereferencestoitself.Thisiswhatwecallrecursivecommontableexpression.
WITHconjuntoAS(--Aquivaiaseleçãodoregistrobasequevocêdesejado(Tambémchamadode"archor")
SELECT pai.*,
1 AS nivel
FROM postagem pai
-- Aqui você insere o parâmetro que dirá qual postagem é a raiz
WHERE pai.id_postagem = 1
UNION ALL
-- Note que abaixo a select tem um union na declaração do "WITH"
SELECT filho.*,
pai.nivel + 1 AS nivel
FROM postagem filho
-- Aqui se aplica a recursão
INNER JOIN conjunto pai ON pai.id_postagem = filho.postagem_pai
)
SELECT conj.*
FROM conjunto conj
RESULT: