none
Dúvida (Subqueries dentro do select e antes do From)

    Question

  •  

    Ola pessoas!!!

     

    Surgiu uma dúvida em uma relatorio que estou desenvolvendo aqui na empresa que trabalho é a primeira vez que faço uma consulta usando sub-query desta forma dentro do select e antes do from olha só...

     

    Code Snippet

    select

    -- DADOS SOBRE ENDEREÇO DO CLIENTE --

                e.EntNome 'Cliente',

                e.EntCpfCgc 'CNPJ',

                e.EntRgIe 'Ins. Est.',

                e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp 'Endereço',

                e.EntBair 'Bairro',

                c.CidNome 'Cidade',

                c.UfSigla 'Sigla',

                e.EntCep 'Cep',

     

    -- DADOS SOBRE A NOTA FISCAL --

                nf.NFNum 'Nota Fiscal',

                nf.NFSaidaEntrada 'Tipo NF',

                nf.NFDataEmis 'Dt Emissão',

                p.ParcPagNFDataVenc 'Dt Vencimento',

                nf.NFNatOpProd 'Natureza Op. Produto',

                nf.NFNatOpServ 'Natureza Op. Serviço',

     

    -- DADOS SOBRE A TRANSPORTADORA --

                (select e.entnome from NOTA_FISCAL nf inner join entidade e

                            on nf.NFTranspEntCod = e.entcod where  NFNum = '072650') 'Transportadora',

                (select e.EntCpfCgc  from NOTA_FISCAL nf inner join entidade e

                            on nf.NFTranspEntCod = e.entcod where  NFNum = '072650') 'CNPJ',

                (select e.EntRgIe  from NOTA_FISCAL nf inner join entidade e

                            on nf.NFTranspEntCod = e.entcod where  NFNum = '072650') 'Ins. Est.',

                (select e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp from NOTA_FISCAL nf inner join entidade e

                            on nf.NFTranspEntCod = e.entcod where  NFNum = '072650') 'Endereço',

                (select e.EntBair from NOTA_FISCAL nf inner join entidade e

                            on nf.NFTranspEntCod = e.entcod where  NFNum = '072650') 'Bairro',

                (select e.EntCep  from NOTA_FISCAL nf inner join entidade e

                            on nf.NFTranspEntCod = e.entcod where  NFNum = '072650') 'Cep',

     

    -- DADOS SOBRE O VENDEDOR --

                vend.VendCod 'Cód. Vendedor' 

     

    from nota_fiscal nf inner join ENTIDADE e on nf.EntCod = e.EntCod

                                inner join CIDADE c on e.CidCod = c.CidCod

                      inner join Parc_Pag_NF p on nf.NFNum = p.NFNum and nf.EmpCod = p.EmpCod and nf.CtrlDFModForm = p.CtrlDFModForm

                                inner join VEND_NF vend on vend.NFNum = nf.NFNum

    where nf.nfnum = '072650'

     

    A dúvida surgiu por que eu não consigo colocar mais de um campo no sub-select ele me da um erro pedindo para eu colocar o EXISTS mas se eu colocar ele da forma que diz o help do sql ele nao entende e dá erro. Teria outra forma de colocar?

     

    Vamos supor, preciso, em vez de fazer varios sub-selects com a mesma coisa eu colocar mais campos dentro de  um unico sub-select, ou seja, ficaria assim:

     

    Code Snippet

                (select

    e.entnome,e.EntCpfCgc,e.EntRgIe,e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp,e.EntBair,e.EntCep 

     

    from NOTA_FISCAL nf inner join entidade e

                            on nf.NFTranspEntCod = e.entcod where  NFNum = '072650'),

     

     

    Ou desta forma ele só traz mesmo um resultado e nao permite trazer varios?

     

    Abraços!

    Wednesday, January 30, 2008 7:53 PM

Answers

  •  

    Olá Clayton,

     

    Da forma como você quer não dá, não pode retornar mais de uma coluna numa subquery que irá formar uma coluna. Você tem duas soluções. Uma é fazer uma subquery e fazer um JOIN com ela e usar seus campos no select, a outra é fazer mais um JOIN com a tabela ENTIDADE e dar outro nome para ela. Vamos ver como fica cada um deles, aí você escolhe qual usar (em itálico é o que mudou).

    Subquery:

    Code Snippet

    select

    -- DADOS SOBRE ENDEREÇO DO CLIENTE --

    e.EntNome 'Cliente',

    e.EntCpfCgc 'CNPJ',

    e.EntRgIe 'Ins. Est.',

    e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp 'Endereço',

    e.EntBair 'Bairro',

    c.CidNome 'Cidade',

    c.UfSigla 'Sigla',

    e.EntCep 'Cep',

    -- DADOS SOBRE A NOTA FISCAL --

    nf.NFNum 'Nota Fiscal',

    nf.NFSaidaEntrada 'Tipo NF',

    nf.NFDataEmis 'Dt Emissão',

    p.ParcPagNFDataVenc 'Dt Vencimento',

    nf.NFNatOpProd 'Natureza Op. Produto',

    nf.NFNatOpServ 'Natureza Op. Serviço',

    -- DADOS SOBRE A TRANSPORTADORA --

    transp.entnome 'Transportadora',

    transp.EntCpfCgc 'CNPJ',

    transp.EntRgIe 'Ins. Est.',

    transp.Endereco 'Endereço',

    transp.EntBair 'Bairro',

    transp.EntCep 'Cep',

    -- DADOS SOBRE O VENDEDOR --

    vend.VendCod 'Cód. Vendedor'

    from nota_fiscal nf

    inner join ENTIDADE e on nf.EntCod = e.EntCod

    inner join CIDADE c on e.CidCod = c.CidCod

    inner join Parc_Pag_NF p on nf.NFNum = p.NFNum and nf.EmpCod = p.EmpCod and nf.CtrlDFModForm = p.CtrlDFModForm

    inner join VEND_NF vend on vend.NFNum = nf.NFNum

    inner join

    (

    select

    e.entcod,

    e.entnome,

    e.EntCpfCgc,

    e.EntRgIe,

    e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp Endereco,

    e.EntBair,

    e.EntCep

    from NOTA_FISCAL nf

    inner join entidade e

    on nf.NFTranspEntCod = e.entcod where NFNum = '072650'

    ) transp on nf.NFTranspEntCod = transp.entcod

    where nf.nfnum = '072650'

     

     

     

    Novo JOIN com nome diferente:

    Code Snippet

    select

    -- DADOS SOBRE ENDEREÇO DO CLIENTE --

    e.EntNome 'Cliente',

    e.EntCpfCgc 'CNPJ',

    e.EntRgIe 'Ins. Est.',

    e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp 'Endereço',

    e.EntBair 'Bairro',

    c.CidNome 'Cidade',

    c.UfSigla 'Sigla',

    e.EntCep 'Cep',

    -- DADOS SOBRE A NOTA FISCAL --

    nf.NFNum 'Nota Fiscal',

    nf.NFSaidaEntrada 'Tipo NF',

    nf.NFDataEmis 'Dt Emissão',

    p.ParcPagNFDataVenc 'Dt Vencimento',

    nf.NFNatOpProd 'Natureza Op. Produto',

    nf.NFNatOpServ 'Natureza Op. Serviço',

    -- DADOS SOBRE A TRANSPORTADORA --

    transp.entnome 'Transportadora',

    transp.EntCpfCgc 'CNPJ',

    transp.EntRgIe 'Ins. Est.',

    transp.EntLograd + ' ' + transp.EntEnder + ', Nº' + transp.EntEnderNo + ' - ' + transp.EntEnderComp 'Endereço',

    transp.EntBair 'Bairro',

    transp.EntCep 'Cep',

    -- DADOS SOBRE O VENDEDOR --

    vend.VendCod 'Cód. Vendedor'

    from nota_fiscal nf

    inner join ENTIDADE e on nf.EntCod = e.EntCod

    inner join CIDADE c on e.CidCod = c.CidCod

    inner join Parc_Pag_NF p on nf.NFNum = p.NFNum and nf.EmpCod = p.EmpCod and nf.CtrlDFModForm = p.CtrlDFModForm

    inner join VEND_NF vend on vend.NFNum = nf.NFNum

    inner join ENTIDADE transp on nf.NFTranspEntCod = transp.entcod

    where nf.nfnum = '072650'

     

     

     

    Resumo da ópera, ambos os casos irão funcionar, mas o JOIN fica mais "bonito" e com melhor performance.

     

    Ahhh... Não esquece de indexar as FKs, dá mais performance ainda Wink

     

     

     

    Abraço!!!!

     

    Thursday, January 31, 2008 2:21 AM

All replies

  • Clayton,

     

    É assim:

     

    SELECT COL1,

        (SELECT SOMENTE_1_COLUNA FROM TABELA WHERE = FILTRO)

    FROM TABELA1

     

    Se você colocar uma sub-consulta dentro da clausula SELECT o memo deverá ter apenas 1 campo e retornar apenas 1 linha

     

    Agora se vc precisa fazer uma sub-consulta e retonar vários valores coloque dentro da clausula FROM com os devidos JOIN

     

    SELECT TAB1.COL1,

                 TAB2.COL1,

       TAB2.COL2

    FROM TABELA1 TAB1 INNER JOIN (SELECT CHAVE, COL1, COL2, COL3 FROM TABELA2) TAB2

    ON TAB1.CHAVE = TAB2.CHAVE

     

    Esse é o conceito.

     


    Ajude a melhorar o nosso Forum!
    Não esqueça de marca a mensagem como "útil", caso tenha ajudado.

    Thursday, January 31, 2008 2:01 AM
  •  

    Olá Clayton,

     

    Da forma como você quer não dá, não pode retornar mais de uma coluna numa subquery que irá formar uma coluna. Você tem duas soluções. Uma é fazer uma subquery e fazer um JOIN com ela e usar seus campos no select, a outra é fazer mais um JOIN com a tabela ENTIDADE e dar outro nome para ela. Vamos ver como fica cada um deles, aí você escolhe qual usar (em itálico é o que mudou).

    Subquery:

    Code Snippet

    select

    -- DADOS SOBRE ENDEREÇO DO CLIENTE --

    e.EntNome 'Cliente',

    e.EntCpfCgc 'CNPJ',

    e.EntRgIe 'Ins. Est.',

    e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp 'Endereço',

    e.EntBair 'Bairro',

    c.CidNome 'Cidade',

    c.UfSigla 'Sigla',

    e.EntCep 'Cep',

    -- DADOS SOBRE A NOTA FISCAL --

    nf.NFNum 'Nota Fiscal',

    nf.NFSaidaEntrada 'Tipo NF',

    nf.NFDataEmis 'Dt Emissão',

    p.ParcPagNFDataVenc 'Dt Vencimento',

    nf.NFNatOpProd 'Natureza Op. Produto',

    nf.NFNatOpServ 'Natureza Op. Serviço',

    -- DADOS SOBRE A TRANSPORTADORA --

    transp.entnome 'Transportadora',

    transp.EntCpfCgc 'CNPJ',

    transp.EntRgIe 'Ins. Est.',

    transp.Endereco 'Endereço',

    transp.EntBair 'Bairro',

    transp.EntCep 'Cep',

    -- DADOS SOBRE O VENDEDOR --

    vend.VendCod 'Cód. Vendedor'

    from nota_fiscal nf

    inner join ENTIDADE e on nf.EntCod = e.EntCod

    inner join CIDADE c on e.CidCod = c.CidCod

    inner join Parc_Pag_NF p on nf.NFNum = p.NFNum and nf.EmpCod = p.EmpCod and nf.CtrlDFModForm = p.CtrlDFModForm

    inner join VEND_NF vend on vend.NFNum = nf.NFNum

    inner join

    (

    select

    e.entcod,

    e.entnome,

    e.EntCpfCgc,

    e.EntRgIe,

    e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp Endereco,

    e.EntBair,

    e.EntCep

    from NOTA_FISCAL nf

    inner join entidade e

    on nf.NFTranspEntCod = e.entcod where NFNum = '072650'

    ) transp on nf.NFTranspEntCod = transp.entcod

    where nf.nfnum = '072650'

     

     

     

    Novo JOIN com nome diferente:

    Code Snippet

    select

    -- DADOS SOBRE ENDEREÇO DO CLIENTE --

    e.EntNome 'Cliente',

    e.EntCpfCgc 'CNPJ',

    e.EntRgIe 'Ins. Est.',

    e.EntLograd + ' ' + e.EntEnder + ', Nº' + e.EntEnderNo + ' - ' + e.EntEnderComp 'Endereço',

    e.EntBair 'Bairro',

    c.CidNome 'Cidade',

    c.UfSigla 'Sigla',

    e.EntCep 'Cep',

    -- DADOS SOBRE A NOTA FISCAL --

    nf.NFNum 'Nota Fiscal',

    nf.NFSaidaEntrada 'Tipo NF',

    nf.NFDataEmis 'Dt Emissão',

    p.ParcPagNFDataVenc 'Dt Vencimento',

    nf.NFNatOpProd 'Natureza Op. Produto',

    nf.NFNatOpServ 'Natureza Op. Serviço',

    -- DADOS SOBRE A TRANSPORTADORA --

    transp.entnome 'Transportadora',

    transp.EntCpfCgc 'CNPJ',

    transp.EntRgIe 'Ins. Est.',

    transp.EntLograd + ' ' + transp.EntEnder + ', Nº' + transp.EntEnderNo + ' - ' + transp.EntEnderComp 'Endereço',

    transp.EntBair 'Bairro',

    transp.EntCep 'Cep',

    -- DADOS SOBRE O VENDEDOR --

    vend.VendCod 'Cód. Vendedor'

    from nota_fiscal nf

    inner join ENTIDADE e on nf.EntCod = e.EntCod

    inner join CIDADE c on e.CidCod = c.CidCod

    inner join Parc_Pag_NF p on nf.NFNum = p.NFNum and nf.EmpCod = p.EmpCod and nf.CtrlDFModForm = p.CtrlDFModForm

    inner join VEND_NF vend on vend.NFNum = nf.NFNum

    inner join ENTIDADE transp on nf.NFTranspEntCod = transp.entcod

    where nf.nfnum = '072650'

     

     

     

    Resumo da ópera, ambos os casos irão funcionar, mas o JOIN fica mais "bonito" e com melhor performance.

     

    Ahhh... Não esquece de indexar as FKs, dá mais performance ainda Wink

     

     

     

    Abraço!!!!

     

    Thursday, January 31, 2008 2:21 AM
  •  

    Fala Alexandre blz!

     

    Cara ...perfect!!!

     

    Testei os dois modos que mencionou e percebi que com a sub-query ele fica mais lento porém ambos atendem o que eu preciso!

     

    O outro exemplo com join ficou otimo e como vc disse mais bonito rs....

     

    Mto Obrigado pela ajuda!

     

    OBS: Eu estava listando os campos colocando cada campo um sub-select ai ficou horrivel! imagine! rs

    Thursday, January 31, 2008 11:30 AM
  •  

    Show cara... por muita coincidência, estava ministrando curso de T-SQL esta semana Big Smile  aí me motivei mais pra te ajudar... hehe

     

     

    Abraço!!!

    Friday, February 01, 2008 3:03 AM