Telescope (core)

Padrão de codificação/indentação SQL

ADS.FAQ-25735
Sempre que possível, as consultas SQL (e comandos DML) deverão ser registradas da seguinte forma:
select COL1 as ALIAS1
, COL2 as ALIAS2
, COL3 as ALIAS3
...
from TABELA1 a
join TABELA2 on condicao
left join TABELA3 on condicao
...
where condicao1
and condicao2
and condicao3
...
group by ...
, ...
order by ...
, ...
limit X offset Y

As regras são:

Expressões

Sempre que houverem expressões extensas dentro do SQL, deve-se quebrar as linhas utilizando os critérios abaixo.

Blocos separados por "(" e ")" devem ter a primeira linha logo a direita do "(" e todas as demais linhas devem ficar alinhadas com o primeiro. Exemplo:
select ...
, ped.valor_total / (bdx.fator_conversao * ped.valor_mercadorias
                     + bdy.taxas_administrativas) as abaco
, ...

Ao quebrar em operadores, o operador deve iniciar a próxima linha. Neste caso, o operador deve ser alinhado de forma que fique abaixo do início da expressão para a qual ele está associado. Exemplos:
select ...
, ped.valor_total
  / (bdx.fator_conversao * ped.valor_mercadorias
     + bdy.taxas_administrativas) as abaco
, ...

select ...
from pedidos pven
join itens_pedidos iven on iven.pedido_id = pven.id
join itens_pedidos icom on icom.item_pedido_venda_id = iven.id
join pedidos pcom on pcom.id = icom.pedido_id 
                     and pcom.fornecedor_id = pven.fornecedor_id
...

Sub-queries

Quando o SQL possuir uma sub-quey, devem ser utilizados os critérios abaixo.

Caso a sub-query ser muito pequena, ele pode ser completamente inserida como uma expressão simples. Exemplo:
select ped.id
, (select sum(valor) from itens where pai_id = ped.id) as soma
from pedidos ped
...

Caso a sub-query seja maior, sugere-se separar toda ela em linhas separadas, seguindo os mesmo critérios de um SQL normal, mas indentando o bloco de forma que a segunda linha fique alinhada à primeira linha que é iniciada logo após o "(". A ultima linha é encerrada com o ")". Exemplo:
select ped.id
, (select sum(i.valor_unitario * i.quantidade)
   from itens_pedidos i
   where i.pai_id = ped.id) as soma
from pedidos ped
...

UNION

O uso do UNION implica que devem existir dois SELECTS com a mesma estrutura de colunas. Para facilitar a visibilidade disso, deve existir uma linha em branco antes e depois do comando UNION ou UNION ALL.

Exemplo:
select doc.emitente_uf as uf
, sum(valor_total_icms_estado_remetente) as valor
, 0.0 as fcp
from doc_entradas_saidas doc
inner join especies esp on esp.id = doc.especie_id
where estabelecimento_id = ?
and data_emissao between ? and ?
group by doc.emitente_uf

union all

select doc.destinatario_uf as uf
, sum(valor_total_icms_estado_destino) as valor
, sum(valor_total_icms_fcp) as fcp
from doc_entradas_saidas doc
inner join especies esp on esp.id = doc.especie_id
where estabelecimento_id = ?
and data_emissao between ? and ?
group by doc.destinatario_uf

Uso de SQL em códigos Java

No caso de códigos java que precisam de comandos SQL, a String contendo o SQL deve seguir a mesma regra acima e todas as linhas após a primeira DEVEM iniciar com um espaço. Exemplo:
String sql = "select gu.grupo"
        + " from permissoes_acesso_registros par"
        + " join grupos_usuarios gu on gu.id = par.grupo_id"
        + " where par.registro_id = ?"
        + " and par.tabela = ?"
        + " order by gu.grupo";

Os motivos para usar um espaço no INÍCIO de cada linha são: