none
loop infinito RRS feed

  • Pergunta

  • Opa!

    entao, fiz o select e acho que entrou em loop infinito. Não deu erro de sintaxe alguma.

    Não sei o que pode ser..

     

    SELECT OP.NOME, L.HORARIO, L.TABELA, L.ACAO, L.DESCRICAO, 
    	CASE 
    		WHEN L.TABELA = 'OPERADOR' THEN OP.NOME 
    		WHEN L.TABELA = 'HORARIO' THEN H.NOME 
    		WHEN L.TABELA = 'INSTALACAO' THEN I.NOME
    		WHEN L.TABELA = 'EQUIPAMENTO' THEN E.NOME
    		WHEN L.TABELA = 'PORTA' THEN P.NOME
    		ELSE U.NOME 
    	END AS 'Elemento afetado'
    FROM OPERADOR AS OP, [LOG] AS L, HORARIO AS H, EQUIPAMENTO AS E, USUARIO AS U, PORTA AS P, INSTALACAO AS I 
    WHERE OP.ID_OPERADOR = L.ID_OPERADOR 
    	 AND L.ID_DESTINO = CASE 
    				WHEN L.TABELA = 'OPERADOR' THEN OP.ID_OPERADOR 
    				WHEN L.TABELA = 'HORARIO' THEN H.ID_HORARIO 
    				WHEN L.TABELA = 'INSTALACAO' THEN I.ID_INSTALACAO 
    				WHEN L.TABELA = 'EQUIPAMENTO' THEN E.ID_EQUIPAMENTO 
    				WHEN L.TABELA = 'PORTA' THEN P.ID_PORTA 
    				ELSE U.ID_USUARIO 
    			  END
    

     

     

    o primeiro case foi para mostrar somente o campo NOME da tabela que for retornada no campo L.TABELA.

    o segundo case é para filtrar as linhas relacionando sempre o L.ID_DESTINO com o ID da tabela especificada ainda em L.TABELA

    att, Jefferson

    segunda-feira, 17 de janeiro de 2011 17:44

Respostas

  • Jefferson,

     

    Pelo que percebi, o caso não é somente nos campos, certo?! Me parece que de acordo com cada informação você deve fazer um Join com uma tabela diferente, é isso?

    O erro está acontecendo logo após o seu primeiro JOIN, na função CASE que você colocou para escolher qual tabela vai fazer o próximo JOIN mas o uso da função CASE desta forma está incorreto.

    Tente desta forma e veja se é o resultado esperado.

     

    SELECT
        OP.NOME,
        L.HORARIO,
        L.TABELA,
        L.ACAO,
        L.DESCRICAO,
        CASE
            WHEN L.TABELA = 'OPERADOR' THEN OP.NOME
            WHEN L.TABELA = 'HORARIO' THEN H.NOME
            WHEN L.TABELA = 'INSTALACAO' THEN I.NOME
            WHEN L.TABELA = 'EQUIPAMENTO' THEN E.NOME
            WHEN L.TABELA = 'PORTA' THEN P.NOME
            ELSE U.NOME
        END AS 'Elemento afetado'
    FROM
        OPERADOR AS OP
        LEFT JOIN [LOG] AS L
            ON OP.ID_OPERADOR = L.ID_OPERADOR
        LEFT  JOIN OPERADOR AS OP
            ON L.ID_DESTINO = OP.ID_OPERADOR
        LEFT JOIN HORARIO AS H
            ON L.ID_DESTINO = H.ID_HORARIO
        LEFT JOIN INSTALACAO AS I
            ON L.ID_DESTINO = I.ID_INSTALACAO
        LEFT JOIN EQUIPAMENTO AS E
            ON L.ID_DESTINO = E.ID_EQUIPAMENTO
        LEFT JOIN PORTA AS P
            ON L.ID_DESTINO = P.ID_PORTA
        LEFT JOIN USUARIO AS U
            ON L.ID_DESTINO = U.ID_USUARIO

     

    []'s


    Erickson Ricci - MCP, MCTS, MCTS BI - ericksonricci.wordpress.com
    • Marcado como Resposta JeffersonDF quarta-feira, 19 de janeiro de 2011 15:59
    segunda-feira, 17 de janeiro de 2011 20:43

Todas as Respostas

  • Jefferson,

    Quando vc coloca tabelas no FROM mas não faz o filtro na cláusula WHERE para fazer o relacionamento, o SQL Server realiza um CROSS JOIN com os dados retornados. Veja um exemplo:

    use tempdb

    create table t1 (c1 int, c2 varchar(50))
    create table t2 (c3 int, c4 varchar(50))

    insert into t1 values (1, 'aaa')
    insert into t1 values (2, 'bbb')
    insert into t1 values (3, 'ccc')


    insert into t2 values (4, 'www')
    insert into t2 values (5, 'eee')
    insert into t2 values (6, 'rrr')

    select c1, c3 from t1, t2

    Repare que o resulta não é o esperado. Todas as tabelas incluídas no FROM devem ter seus relacionamentos listados na cláusula WHERE.

    Recomendo, inclusive, que preferencialmente seja utilizado o modelo <tabela> INNER JOIN <tabela2> ON <filtro>.

     

    []'s


    Erickson Ricci - MCP, MCTS, MCTS BI - ericksonricci.wordpress.com
    segunda-feira, 17 de janeiro de 2011 18:02
  • caraca!

    verdade cara, eu ja ia perguntar isso pois eu diminuih o numero de registros e tirei algumas das tabelas ali e o resultado foi monstruoso, com algumas dezenas de linhas o sql formou 63 mil e poucos rows. E demorou um tempinho.

    segunda-feira, 17 de janeiro de 2011 18:06
  • Erickson,

    agora estou errando na sintaxe.

    SELECT OP.NOME, L.HORARIO, L.TABELA, L.ACAO, L.DESCRICAO, 
    	CASE 
    		WHEN L.TABELA = 'OPERADOR' THEN OP.NOME 
    		WHEN L.TABELA = 'HORARIO' THEN H.NOME 
    		WHEN L.TABELA = 'INSTALACAO' THEN I.NOME
    		WHEN L.TABELA = 'EQUIPAMENTO' THEN E.NOME
    		WHEN L.TABELA = 'PORTA' THEN P.NOME
    		ELSE U.NOME 
    	END AS 'Elemento afetado'
    FROM OPERADOR AS OP LEFT OUTER JOIN [LOG] AS L ON OP.ID_OPERADOR = L.ID_OPERADOR INNER JOIN 
    CASE 
    							WHEN L.TABELA = 'OPERADOR' THEN OPERADOR AS OP 
    							WHEN L.TABELA = 'HORARIO' THEN HORARIO AS H 
    							WHEN L.TABELA = 'INSTALACAO' THEN INSTALACAO AS I 
    							WHEN L.TABELA = 'EQUIPAMENTO' THEN EQUIPAMENTO AS E
    							WHEN L.TABELA = 'PORTA' THEN PORTA AS P
    							ELSE U.ID_USUARIO 
    						 END
    ON L.ID_DESTINO = CASE 
    							WHEN L.TABELA = 'OPERADOR' THEN OP.ID_OPERADOR 
    							WHEN L.TABELA = 'HORARIO' THEN H.ID_HORARIO 
    							WHEN L.TABELA = 'INSTALACAO' THEN I.ID_INSTALACAO 
    							WHEN L.TABELA = 'EQUIPAMENTO' THEN E.ID_EQUIPAMENTO 
    							WHEN L.TABELA = 'PORTA' THEN P.ID_PORTA 
    							ELSE U.ID_USUARIO 
    						 END
    

    a idéia eh a mesma do sql la de cima.

    Não sabia usar esses joins até agora pouco rsrs, meu sql esta apontando um erro de sintaxe proximo ao primeiro CASE.

    segunda-feira, 17 de janeiro de 2011 18:13
  • simplificando:

    SELECT OP.NOME, L.HORARIO, L.TABELA, L.ACAO, L.DESCRICAO, 
    	CASE 
    		WHEN L.TABELA = 'OPERADOR' THEN OP.NOME 
    		WHEN L.TABELA = 'HORARIO' THEN H.NOME 
    		WHEN L.TABELA = 'INSTALACAO' THEN I.NOME
    		WHEN L.TABELA = 'EQUIPAMENTO' THEN E.NOME
    		WHEN L.TABELA = 'PORTA' THEN P.NOME
    		ELSE U.NOME 
    	END AS 'Elemento afetado'
    FROM OPERADOR AS OP LEFT OUTER JOIN [LOG] AS L ON OP.ID_OPERADOR = L.ID_OPERADOR 
    	CASE 
    		WHEN L.TABELA = 'OPERADOR' THEN INNER JOIN OPERADOR AS OP ON L.ID_DESTINO = OP.ID_OPERADOR 
    		WHEN L.TABELA = 'HORARIO' THEN INNER JOIN HORARIO AS H ON L.ID_DESTINO = H.ID_HORARIO 
    		WHEN L.TABELA = 'INSTALACAO' THEN INNER JOIN INSTALACAO AS I ON L.ID_DESTINO = I.ID_INSTALACAO 
    		WHEN L.TABELA = 'EQUIPAMENTO' THEN INNER JOIN EQUIPAMENTO AS E ON L.ID_DESTINO = E.ID_EQUIPAMENTO 
    		WHEN L.TABELA = 'PORTA' THEN INNER JOIN PORTA AS P ON L.ID_DESTINO = P.ID_PORTA 
    		ELSE INNER JOIN USUARIO AS U ON L.ID_DESTINO = U.ID_USUARIO 
    	END
    
    
    permanece o erro de sintaxe proximo ao primeiro CASE

    segunda-feira, 17 de janeiro de 2011 18:30
  • Jefferson,

     

    Pelo que percebi, o caso não é somente nos campos, certo?! Me parece que de acordo com cada informação você deve fazer um Join com uma tabela diferente, é isso?

    O erro está acontecendo logo após o seu primeiro JOIN, na função CASE que você colocou para escolher qual tabela vai fazer o próximo JOIN mas o uso da função CASE desta forma está incorreto.

    Tente desta forma e veja se é o resultado esperado.

     

    SELECT
        OP.NOME,
        L.HORARIO,
        L.TABELA,
        L.ACAO,
        L.DESCRICAO,
        CASE
            WHEN L.TABELA = 'OPERADOR' THEN OP.NOME
            WHEN L.TABELA = 'HORARIO' THEN H.NOME
            WHEN L.TABELA = 'INSTALACAO' THEN I.NOME
            WHEN L.TABELA = 'EQUIPAMENTO' THEN E.NOME
            WHEN L.TABELA = 'PORTA' THEN P.NOME
            ELSE U.NOME
        END AS 'Elemento afetado'
    FROM
        OPERADOR AS OP
        LEFT JOIN [LOG] AS L
            ON OP.ID_OPERADOR = L.ID_OPERADOR
        LEFT  JOIN OPERADOR AS OP
            ON L.ID_DESTINO = OP.ID_OPERADOR
        LEFT JOIN HORARIO AS H
            ON L.ID_DESTINO = H.ID_HORARIO
        LEFT JOIN INSTALACAO AS I
            ON L.ID_DESTINO = I.ID_INSTALACAO
        LEFT JOIN EQUIPAMENTO AS E
            ON L.ID_DESTINO = E.ID_EQUIPAMENTO
        LEFT JOIN PORTA AS P
            ON L.ID_DESTINO = P.ID_PORTA
        LEFT JOIN USUARIO AS U
            ON L.ID_DESTINO = U.ID_USUARIO

     

    []'s


    Erickson Ricci - MCP, MCTS, MCTS BI - ericksonricci.wordpress.com
    • Marcado como Resposta JeffersonDF quarta-feira, 19 de janeiro de 2011 15:59
    segunda-feira, 17 de janeiro de 2011 20:43
  • eh essa a ideia mesmo Erickson!

    Agora deu um erro acho que facil de corrigir, talvez tenha que mudar o join da tabela operador com ela mesma pois está me mostrando isso:

    O nome de correlação 'OP' está especificado várias vezes em uma cláusula FROM.

    terça-feira, 18 de janeiro de 2011 10:53