2/2/2018 Database / sql server

Essa dica é pra quem quer fazer uma query SQL Server e quer que ela seja disponilizada via JSON.

Usar inner join, com inner join e mais inner join, é uma Merda!

Ex: usando inner join 

SELECT     imovel.cod, 
           imovel.referencia, 
           medias.idmedia, 
           medias.txtpath, 
           h.txatividade 
FROM      [hfbimoveis-bkp].[dbo].[tabImovel] imovel 
INNER JOIN tabmedia medias 
ON         ( 
                      imovel.cod = medias.codimovel) 
INNER JOIN tabimovelhistorico H 
ON         h.codimovel = imovel.cod 
WHERE      imovel.cod = 1133 FOR json auto

[
{"cod":1133,
"referencia":"CL107",
"medias":[
{
"idMedia":3925,
"txtPath":"Cittá Fachadas (4)_640x480.jpg",

"H":[
{"txAtividade":"Cadastrou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"},{"txAtividade":"Atualizou o Laudo"}]}]}]

Olha oque aconteceu? O meu historico foi parar dentro das MEDIAS! Errado neh

Por isso, é preferível fazer usando select, dentro de select

SELECT imovel.cod, 
       imovel.referencia, 
       ( 
              SELECT m.idmedia, 
                     m.txtpath 
              FROM   tabmedia M 
              WHERE  m.codimovel = imovel.cod FOR json auto) AS m, 
       ( 
              SELECT h.txatividade 
              FROM   tabimovelhistorico AS h 
              WHERE  h.codimovel = imovel.cod FOR json auto) AS h 
FROM   [hfbimoveis-bkp].[dbo].[tabImovel] imovel 
WHERE  imovel.cod = 1133 FOR json auto

[
{"cod":1133,
"referencia":"CL107",
"m":[{"idmedia":3925,"txtpath":"Cittá Fachadas (4)_640x480.jpg"}],
"h":[
{"txatividade":"Cadastrou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"},{"txatividade":"Atualizou o Laudo"}]
}]

As medias ficaram em 1 linha, e os historicos ficaram em outra linha!

Espero que isso ajude, tanto quanto me ajudou ;-)