none
Como melhoro essa consulta? RRS feed

  • Pergunta

  • Olá pessoal,

    Tenho uma subquery que está retornando mais de um resultado. Para tentar resolver o problema, fiz minha consulta da seguinte maneira:

    SELECT NOMINAL = UPPER(A.NOMINAL),

    (DECLARE @SQLStr VARCHAR(5000)

    SET @SQLStr = '' SELECT @SQLStr = @SQLStr + CAST(X.IDBORDERO AS VARCHAR(15)) + ' '

    FROM (

    SELECT CAST(X.IDBORDERO AS VARCHAR(15)) FROM FBORDERO X (NOLOCK)

    WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA) AS Z

    SET @SQLStr = LEFT(@SQLStr,len(@SQLStr))

    SELECT @SQLStr AS W),

    TIPO = (SELECT UPPER(X.NOME) FROM

    V_TIPOEXTRATOCAIXA X (NOLOCK)

    WHERE X.CODIGO = A.TIPO),

    CONTA_CAIXA = UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO),

    ENDERECO = CASE WHEN C.BAIRRO IS NOT NULL THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: ' + UPPER(C.BAIRRO) ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) END, CIDADE = UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP, FONE = CASE WHEN C.FAX IS NOT NULL THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX ELSE 'FONE: ' + C.TELEFONE END, EMAIL = 'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br', CNPJ = C.CGC

    FROM FXCX A (NOLOCK)

    INNER JOIN FCXA B (NOLOCK) ON (B.CODCXA = A.CODCXA)

    INNER JOIN GCOLIGADA C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA)

    WHERE A.DATA BETWEEN '2016/01/01'

    AND '2016/01/30'

    AND A.CODCXA LIKE :CONTA_CAIXA_L

    AND A.TIPO IN (3, 7)

    GROUP BY A.NOMINAL, A.NUMERODOCUMENTO, A.VALOR, A.TIPO, A.CODCXA, B.CODCOLIGADA, B.CODCXA, B.DESCRICAO, C.RUA, C.BAIRRO, C.NUMERO, C.CEP, C.CIDADE, C.ESTADO, C.FAX, C.TELEFONE, C.EMAIL, C.CGC


    Mas ocorre o seguinte erro na instrução em vermelho.

    Msg 102, Level 15, State 1, Line 10
    Incorrect syntax near '='.
    Msg 156, Level 15, State 1, Line 14
    Incorrect syntax near the keyword 'AS'.
    Msg 102, Level 15, State 1, Line 16
    Incorrect syntax near ')'.
    Msg 102, Level 15, State 1, Line 18
    Incorrect syntax near ','.

    Alguém poderia me ajudar?

    Grato,

    Ilano

    terça-feira, 8 de novembro de 2016 15:14

Respostas

  • Você disse que o XML não funciona, mas experimente fazer uns testes com a query abaixo:

    SELECT 
        NOMINAL = UPPER(A.NOMINAL),
        TIPO = (SELECT UPPER(X.NOME) FROM V_TIPOEXTRATOCAIXA X (NOLOCK) WHERE X.CODIGO = A.TIPO),
        CONTA_CAIXA = UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO),
        ENDERECO = CASE WHEN C.BAIRRO IS NOT NULL THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: ' + UPPER(C.BAIRRO) ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) END, 
        CIDADE = UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP, 
        FONE = CASE WHEN C.FAX IS NOT NULL THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX ELSE 'FONE: ' + C.TELEFONE END, 
        EMAIL = 'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br', 
        CNPJ = C.CGC,
        STUFF
            ( (SELECT ', ' + CAST(X.IDBORDERO AS VARCHAR(15))
               FROM FBORDERO X
               WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA
               FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
              ,1, 2, '')
    FROM FXCX A (NOLOCK)
    INNER JOIN FCXA B (NOLOCK) ON B.CODCXA = A.CODCXA
    INNER JOIN GCOLIGADA C (NOLOCK) ON C.CODCOLIGADA = A.CODCOLIGADA
    WHERE 
        A.DATA BETWEEN '2016/01/01' AND '2016/01/30' AND 
        A.CODCXA LIKE :CONTA_CAIXA_L AND 
        A.TIPO IN (3, 7)
    GROUP BY 
        A.NOMINAL, 
        A.NUMERODOCUMENTO, 
        A.VALOR, 
        A.TIPO, 
        A.CODCXA, 
        B.CODCOLIGADA, 
        B.CODCXA, 
        B.DESCRICAO, 
        C.RUA, 
        C.BAIRRO, 
        C.NUMERO, 
        C.CEP, 
        C.CIDADE, 
        C.ESTADO, 
        C.FAX, 
        C.TELEFONE, 
        C.EMAIL, 
        C.CGC
    

    Se não funcionar, acho melhor você postar a mensagem de erro exibida, citando também a versão do SQL Server que você está utilizando.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 9 de novembro de 2016 16:33

Todas as Respostas

  • Você está construindo uma Stored Procedure ou uma query simples? Pois você está misturando SELECT com DECLARE e por aí vai.

    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    terça-feira, 8 de novembro de 2016 15:39
  • Boa tarde,

    Como você quer que fique o resultado quando a subquery retorna mais de um resultado?


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 8 de novembro de 2016 15:40
  • Olá Juliano,

    Desde já agradeço sua atenção.

    Pois é, era pra ser uma consulta com uma subquery. Como ela traz vários resultados não dá pra rodar a query. Então fiz esse modelo, maluco eu sei, pra ver se vocês poderiam me dar uma luz de como resolvo esse problema. Tem como, numa query deixar tudo separado? Se tiver, como seria?

    terça-feira, 8 de novembro de 2016 15:45
  • Sim gapimex, a suquery retorna mais de um registro.

    Eu tentei fazer usando aquele esquema que tem XML e tal, mas quando inserida a consulta no sistema (TOTVS) não rola. O XML não é interpretado. Sendo assim, tentei essa fórmula maluca rrrssss...

    Quero que nessa subquery ele me traga os valores um ao lado do outro seguidos por vírgula ou ponto-e-vírgula, seja como for. O importante é listá-los um ao lado do outro.

    terça-feira, 8 de novembro de 2016 15:53
  • O que aconteceu exatamente quando você tentou com o XML?

    Você pode postar a sua consulta com o XML e a mensagem que é exibida?


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 8 de novembro de 2016 17:18
  • Cara, não me lembro pois faz um bom tempo que tentei isso, mas ele diz algo como não encontrou o arquivo XML, algo assim. Só sei que não rola, dentro do gerador de SQL da TOTVS.
    terça-feira, 8 de novembro de 2016 17:26
  • Alguma sugestão???
    quarta-feira, 9 de novembro de 2016 14:47
  • Você disse que o XML não funciona, mas experimente fazer uns testes com a query abaixo:

    SELECT 
        NOMINAL = UPPER(A.NOMINAL),
        TIPO = (SELECT UPPER(X.NOME) FROM V_TIPOEXTRATOCAIXA X (NOLOCK) WHERE X.CODIGO = A.TIPO),
        CONTA_CAIXA = UPPER(A.CODCXA) + ' - ' + UPPER(B.DESCRICAO),
        ENDERECO = CASE WHEN C.BAIRRO IS NOT NULL THEN UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) + ' - BAIRRO: ' + UPPER(C.BAIRRO) ELSE UPPER(C.RUA) + ', ' + UPPER(C.NUMERO) END, 
        CIDADE = UPPER(C.CIDADE) + ' - ' + UPPER(C.ESTADO) + ' - CEP: ' + C.CEP, 
        FONE = CASE WHEN C.FAX IS NOT NULL THEN 'FONE: ' + C.TELEFONE + ' - FAX: ' + C.FAX ELSE 'FONE: ' + C.TELEFONE END, 
        EMAIL = 'E-MAIL: ' + LOWER(C.EMAIL) + ' - HOME PAGE: http://www.centec.org.br', 
        CNPJ = C.CGC,
        STUFF
            ( (SELECT ', ' + CAST(X.IDBORDERO AS VARCHAR(15))
               FROM FBORDERO X
               WHERE X.CODCOLIGADA = B.CODCOLIGADA AND X.CODCXA = B.CODCXA
               FOR XML PATH(''), TYPE).value('.', 'varchar(max)')
              ,1, 2, '')
    FROM FXCX A (NOLOCK)
    INNER JOIN FCXA B (NOLOCK) ON B.CODCXA = A.CODCXA
    INNER JOIN GCOLIGADA C (NOLOCK) ON C.CODCOLIGADA = A.CODCOLIGADA
    WHERE 
        A.DATA BETWEEN '2016/01/01' AND '2016/01/30' AND 
        A.CODCXA LIKE :CONTA_CAIXA_L AND 
        A.TIPO IN (3, 7)
    GROUP BY 
        A.NOMINAL, 
        A.NUMERODOCUMENTO, 
        A.VALOR, 
        A.TIPO, 
        A.CODCXA, 
        B.CODCOLIGADA, 
        B.CODCXA, 
        B.DESCRICAO, 
        C.RUA, 
        C.BAIRRO, 
        C.NUMERO, 
        C.CEP, 
        C.CIDADE, 
        C.ESTADO, 
        C.FAX, 
        C.TELEFONE, 
        C.EMAIL, 
        C.CGC
    

    Se não funcionar, acho melhor você postar a mensagem de erro exibida, citando também a versão do SQL Server que você está utilizando.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 9 de novembro de 2016 16:33
  • Bom dia,

    Devido a falta de interação do autor dessa pergunta,

    essa thread está sendo fechada. Caso o problema ainda

    esteja ocorrendo, favor abrir uma nova thread.

    Atenciosamente,


    Robson William Silva

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 11 de novembro de 2016 11:41