none
Substituição de *= e =* por Left Join e Rigth Join RRS feed

  • Pergunta

  • Senhores bom dia,

    Estou alterando algumas consultas em minha base que utilizam *= e =*, porém em uma consulta não obtive o mesmo resultado.

    FROM TABELA D, TABELA C, TABELA P, TABELA V
    WHERE C.CODIGO *= D.CODIGO
    	AND P.CODIGO = C.CODIGO
    	AND P.CODIGO = V.CODIGO
    Resultado: 27 linhas

    Alterei o código acima para a nova sintaxe.

    FROM TABELA C
    
    	LEFT JOIN TABELA D ON D.CODIGO = C.CODIGO
    
    	INNER JOIN TABELA P ON P.CODIGO = C.CODIGO
    
    	INNER JOIN TABELA V ON V.CODIGO = P.CODIGO<br/>
    
    

    Ou ..

    FROM TABELA D
    
    	RIGHT JOIN TABELA C ON C.CODIGO = D.CODIGO
    
    	INNER JOIN TABELA P ON P.CODIGO = C.CODIGO
    
    	INNER JOIN TABELA V ON V.CODIGO = P.CODIGO
    
    
    Resultado: 8 Linhas

    Ouvi algumas vezes falar que *= e =* trazem informações indevidas, porém gostaria da opinião e ajuda de vocês, possa ser que eu esteja cometendo alguma falha
    Serviu como Resposta ? Marque por favor.
    • Editado Rafael O. Pinheiro quarta-feira, 21 de outubro de 2009 12:48 Inserção de Código
    quarta-feira, 21 de outubro de 2009 12:47

Respostas

Todas as Respostas

  • Obs.: A TABELA C é uma View.


    Serviu como Resposta ? Marque por favor.
    quarta-feira, 21 de outubro de 2009 13:13
  • Rafael,

    Eu particularmente nunca utilizei *=


    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 21 de outubro de 2009 13:34
  • Senhores,

    O plano de execução de um comando muda do Level 70 para o Level 80 ?

    Segue abaixo exemplo:

    CREATE TABLE #TABLE_A(
    CODIGO INT, NOME VARCHAR(30), DATA SMALLDATETIME)
    
    -- Como se fosse minha View
    CREATE TABLE #TABLE_B(CODIGO INT, NOME VARCHAR(30))
    
    GO
    
    INSERT INTO #TABLE_B VALUES(1, 'Nome 1')
    INSERT INTO #TABLE_B VALUES(2, 'Nome 2')
    INSERT INTO #TABLE_B VALUES(3, 'Nome 3')
    INSERT INTO #TABLE_B VALUES(4, 'Nome 4')
    INSERT INTO #TABLE_B VALUES(5, 'Nome 5')
    
    GO
    
    -- Retorna 5 informações
    SELECT *
    FROM #TABLE_A A,
    		#TABLE_B B
    WHERE B.CODIGO *= A.CODIGO
    		AND A.DATA = '20091021'
    
    -- Não tenho informações
    SELECT *
    FROM #TABLE_A A
    		RIGHT JOIN #TABLE_B B ON B.CODIGO = A.CODIGO
    WHERE A.DATA = '20091021'
    
    -- Não tenho informações
    SELECT *
    FROM (SELECT A.CODIGO AS CODI_A, A.NOME AS NOME_A, DATA, B.CODIGO AS CODI_B, B.NOME AS NOME_B
    		FROM #TABLE_A A
    				RIGHT JOIN #TABLE_B B ON B.CODIGO = A.CODIGO) A
    WHERE A.DATA = '20091021'
    
    -- Retorna 5 informações
    SELECT *
    FROM (SELECT * FROM #TABLE_A WHERE DATA = '20091021') A
    		RIGHT JOIN #TABLE_B B ON B.CODIGO = A.CODIGO

    Serviu como Resposta ? Marque por favor.
    quarta-feira, 21 de outubro de 2009 13:49
  • Senhores,

    Verifiquei um artigo do Gustavo Maia que resolveu minhas dúvidas.

    Segue o link:

    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!422.entry

    Parabens pelo Artigo Gustavo.


    Serviu como Resposta ? Marque por favor.
    quarta-feira, 21 de outubro de 2009 13:54
  • Olá Rafael,

    Puxa que bom ver esse elogio. Escrevo muitos artigos, mas não tenho tantos feedbacks assim.
    É muito bom ver que o artigo o ajudou.

    [ ]s,
     
    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Hash Indexes – Uma implementação no SQL Server – Parte I
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!750.entry


    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 22 de outubro de 2009 01:53