Query with conditions in SQL SERVER

4

Follow the tables below with my question

I have a problem in which to make a filter where I need to pick up the posts that have the post_pai column from the post table with a value other than 0, and I also need to check if the post_address_id is equal to the post_id's post_id in the post_pai column. It is in this second item that I am embolando. I've mounted my query, but I do not know if it is 100%. Follow below:

SELECT p.id_postagem, p.titulo, a.nome
FROM postagem p JOIN autor a
ON p.id_autor = a.id_autor
WHERE postagem_pai <> 0
AND C.id_autor = (SELECT id_autor FROM postagem where id_postagem = c.postagem_pai AND id_autor = u.id_autor) 

If it is not correct, how should I make these conditions?

NOTE: I am using SQL SERVER

    
asked by anonymous 17.08.2016 / 15:38

3 answers

2

You can use a "Self Join" to filter posts where the author of the post is equal to the author of the parent post:

SELECT 
   pFilho.id_postagem, pFilho.titulo, a.nome
FROM
   postagem pFilho
   INNER JOIN postagem pPai
      ON pFilho.postagem_pai = pPai.id_postagem
      AND pFilho.id_autor = pPai.id_autor
   INNER JOIN autor a
      ON pFilho.id_autor = a.id_autor
WHERE
   pFilho.postagem_pai <> 0 

This last condition is redundant, since there is probably no posting with id_postagem zerada.

    
17.08.2016 / 16:33
1

I think that if you use left join to relate the two tables it will be simpler:

SELECT p.id_postagem, p.titulo, a.nome
FROM postagem p 
LEFT JOIN autor a
  ON p.id_autor = a.id_autor
WHERE postagem_pai <> 0
  AND p.id_autor = p.postagem_pai
    
17.08.2016 / 15:44
1

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

SotoproducetheselectionofallpostsIusedtheexpressionWITHofSQLServer.

  

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:

    
22.11.2016 / 19:01