none
Incluir Inner Join apenas se a condição for satisfatoria RRS feed

  • Pergunta

  • Pessoal;

        preciso criar uma consulta no sql que apenas inclua o inner join caso o resultado de outro select seja maior que 0, um count...

    segue abaixo um exemplo do que estou pensando:

    SELECT Distinct Pessoa.CodigoPessoa,       Pessoa.CnpjCpfPessoa,       Pessoa.NaturezaPessoa,       
    Pessoa.RazaoSocial,       ISNULL(Pessoa.NomeFantasia,Pessoa.RazaoSocial) as NomeRazao,        
    Pessoa.NomeFantasia FROM   Pessoa 
    if (select count(*) from LoginExtranetPessoa where Login = 'wsena' > 0) then  -->>>> ESSE AQUI SERIA A CONDIÇÃO PARA INCLUIR A LINHA ABAIXO (ASSIM NÃO DÁ CERTO)
    INNER JOIN LoginExtranetPessoa LoginExtranetPessoa
    ON LoginExtranetPessoa.Login = 'wsena' and LoginExtranetPessoa.CodigoPessoa = Pessoa.CodigoPessoa
    WHERE  Pessoa.CodigoPessoa > -1 and Pessoa.CodigoPessoa 
    IN   (   SELECT CodigoPessoa From TipoPessoa    WHERE TipoPessoa.CodigoPessoa=Pessoa.CodigoPessoa      
    AND 'C' Like '%'+TipoPessoa.CodigoTipoPessoa+'%' )  
    ORDER BY NomeRazao

    quarta-feira, 27 de fevereiro de 2013 12:27

Respostas

  • consegui ficou assim:

    IF EXISTS(SELECT * FROM LoginExtranetPessoa where Login = 'wsena')
    BEGIN
      SELECT DISTINCT 
        Pessoa.CodigoPessoa,       
        Pessoa.CnpjCpfPessoa,       
        Pessoa.NaturezaPessoa,
        Pessoa.RazaoSocial,       
        ISNULL(Pessoa.NomeFantasia,Pessoa.RazaoSocial) AS NomeRazao,   
        Pessoa.NomeFantasia 
      FROM   
        Pessoa 
        INNER JOIN LoginExtranetPessoa LoginExtranetPessoa ON LoginExtranetPessoa.Login = 'wsena' and LoginExtranetPessoa.CodigoPessoa = Pessoa.CodigoPessoa
      WHERE  
        Pessoa.CodigoPessoa > -1 AND 
        Pessoa.CodigoPessoa IN   (SELECT CodigoPessoa From TipoPessoa WHERE TipoPessoa.CodigoPessoa=Pessoa.CodigoPessoa AND 'C' Like '%'+TipoPessoa.CodigoTipoPessoa+'%' )  
     ORDER 
        BY NomeRazao 
    END 
    ELSE
    BEGIN
       SELECT DISTINCT 
        Pessoa.CodigoPessoa,       
        Pessoa.CnpjCpfPessoa,       
        Pessoa.NaturezaPessoa,
        Pessoa.RazaoSocial,       
        ISNULL(Pessoa.NomeFantasia,Pessoa.RazaoSocial) AS NomeRazao,   
        Pessoa.NomeFantasia 
      FROM   
        Pessoa     
      WHERE  
        Pessoa.CodigoPessoa > -1 AND 
        Pessoa.CodigoPessoa IN   (SELECT CodigoPessoa From TipoPessoa WHERE TipoPessoa.CodigoPessoa=Pessoa.CodigoPessoa AND 'C' Like '%'+TipoPessoa.CodigoTipoPessoa+'%' )  
     ORDER 
        BY NomeRazao 
    END

    • Marcado como Resposta Wagner Sena PE quarta-feira, 27 de fevereiro de 2013 17:05
    quarta-feira, 27 de fevereiro de 2013 17:05

Todas as Respostas

  • Wagner,

    Voce não consegue fazer isso dessa maneira, se precisa realmente fazer isso deve-se utiliza SQL Dinamico, ou seja, jogando sua query em uma variavel texto e executando a variavel, conforme script abaixo:

    DECLARE

    @SQL VARCHAR(8000)

    SET

    @SQL = ''

    SET

    @SQL =

    '

    SELECT Distinct Pessoa.CodigoPessoa, Pessoa.CnpjCpfPessoa, Pessoa.NaturezaPessoa,

    Pessoa.RazaoSocial, ISNULL(Pessoa.NomeFantasia,Pessoa.RazaoSocial) as NomeRazao,

    Pessoa.NomeFantasia FROM Pessoa

    '

    if

    ((select count(*) from LoginExtranetPessoa where Login = 'wsena') 0 > 0)

    BEGIN

    SET @SQL = @SQL + 'JOIN LoginExtranetPessoa LoginExtranetPessoa

    ON LoginExtranetPessoa.Login = ''wsena'' and LoginExtranetPessoa.CodigoPessoa = Pessoa.CodigoPessoa

    '

    END

    SET

    @SQL = @SQL +

    'WHERE Pessoa.CodigoPessoa > -1 and Pessoa.CodigoPessoa

    IN ( SELECT CodigoPessoa From TipoPessoa WHERE TipoPessoa.CodigoPessoa=Pessoa.CodigoPessoa

    AND ''C'' Like ''%''+TipoPessoa.CodigoTipoPessoa+''%'' )

    ORDER BY NomeRazao'

    EXECUTE

    (@SQL)


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 27 de fevereiro de 2013 12:36
    Moderador
  • Uma outra opção seria a validação antes do Select. Exemplo:

    IF EXISTS(SELECT * FROM LoginExtranetPessoa where Login = 'wsena' > 0)
    BEGIN
      SELECT DISTINCT
        Pessoa.CodigoPessoa,       
        Pessoa.CnpjCpfPessoa,       
        Pessoa.NaturezaPessoa,
        Pessoa.RazaoSocial,       
        ISNULL(Pessoa.NomeFantasia,Pessoa.RazaoSocial) AS NomeRazao,   
        Pessoa.NomeFantasia
      FROM   
        Pessoa
        INNER JOIN LoginExtranetPessoa LoginExtranetPessoa ON LoginExtranetPessoa.Login = 'wsena' and LoginExtranetPessoa.CodigoPessoa = Pessoa.CodigoPessoa
      WHERE  
        Pessoa.CodigoPessoa > -1 AND
        Pessoa.CodigoPessoa IN   (SELECT CodigoPessoa From TipoPessoa WHERE TipoPessoa.CodigoPessoa=Pessoa.CodigoPessoa AND 'C' Like '%'+TipoPessoa.CodigoTipoPessoa+'%' )  
     ORDER
        BY NomeRazao
    END
    ELSE
    BEGIN
       SELECT DISTINCT
        Pessoa.CodigoPessoa,       
        Pessoa.CnpjCpfPessoa,       
        Pessoa.NaturezaPessoa,
        Pessoa.RazaoSocial,       
        ISNULL(Pessoa.NomeFantasia,Pessoa.RazaoSocial) AS NomeRazao,   
        Pessoa.NomeFantasia
      FROM   
        Pessoa     
      WHERE  
        Pessoa.CodigoPessoa > -1 AND
        Pessoa.CodigoPessoa IN   (SELECT CodigoPessoa From TipoPessoa WHERE TipoPessoa.CodigoPessoa=Pessoa.CodigoPessoa AND 'C' Like '%'+TipoPessoa.CodigoTipoPessoa+'%' )  
     ORDER
        BY NomeRazao
    END
    quarta-feira, 27 de fevereiro de 2013 15:04
  • esta é a unica maneira de ser feito? pois coloco essa consulta dentro de um DropDownList no VS 2010, e desta forma ele nao aceita...
    quarta-feira, 27 de fevereiro de 2013 16:56
  • tentei esta forma acima, porem apresenta o seguinte erro:

    Mensagem 102, Nível 15, Estado 1, Linha 1
    Incorrect syntax near '>'.
    Mensagem 156, Nível 15, Estado 1, Linha 19
    Incorrect syntax near the keyword 'ELSE'.

    quarta-feira, 27 de fevereiro de 2013 17:02
  • consegui ficou assim:

    IF EXISTS(SELECT * FROM LoginExtranetPessoa where Login = 'wsena')
    BEGIN
      SELECT DISTINCT 
        Pessoa.CodigoPessoa,       
        Pessoa.CnpjCpfPessoa,       
        Pessoa.NaturezaPessoa,
        Pessoa.RazaoSocial,       
        ISNULL(Pessoa.NomeFantasia,Pessoa.RazaoSocial) AS NomeRazao,   
        Pessoa.NomeFantasia 
      FROM   
        Pessoa 
        INNER JOIN LoginExtranetPessoa LoginExtranetPessoa ON LoginExtranetPessoa.Login = 'wsena' and LoginExtranetPessoa.CodigoPessoa = Pessoa.CodigoPessoa
      WHERE  
        Pessoa.CodigoPessoa > -1 AND 
        Pessoa.CodigoPessoa IN   (SELECT CodigoPessoa From TipoPessoa WHERE TipoPessoa.CodigoPessoa=Pessoa.CodigoPessoa AND 'C' Like '%'+TipoPessoa.CodigoTipoPessoa+'%' )  
     ORDER 
        BY NomeRazao 
    END 
    ELSE
    BEGIN
       SELECT DISTINCT 
        Pessoa.CodigoPessoa,       
        Pessoa.CnpjCpfPessoa,       
        Pessoa.NaturezaPessoa,
        Pessoa.RazaoSocial,       
        ISNULL(Pessoa.NomeFantasia,Pessoa.RazaoSocial) AS NomeRazao,   
        Pessoa.NomeFantasia 
      FROM   
        Pessoa     
      WHERE  
        Pessoa.CodigoPessoa > -1 AND 
        Pessoa.CodigoPessoa IN   (SELECT CodigoPessoa From TipoPessoa WHERE TipoPessoa.CodigoPessoa=Pessoa.CodigoPessoa AND 'C' Like '%'+TipoPessoa.CodigoTipoPessoa+'%' )  
     ORDER 
        BY NomeRazao 
    END

    • Marcado como Resposta Wagner Sena PE quarta-feira, 27 de fevereiro de 2013 17:05
    quarta-feira, 27 de fevereiro de 2013 17:05