Usuário com melhor resposta
Ajuste de Consulta - Subconsulta com GROUP BY

Pergunta
-
Fala pessoal!!!
Estou tentando resolver um problema com minha consulta.
Estou ajustando algumas rotinas em um sistema em VBA e me deparei com uma consulta feita em Access, ela funciona muito bem como uma consulta salva, porém estou tentando transforma-la em uma string, que será enviada (via execute) para o BD SQL.
Pelo que entendi, o problema todo acontece porque ela tem como base, uma consulta agrupada.
Segue a encrenca.....
SELECT Sinistro.sinistro, Titular, Sinistrado, Clientes_Apolices.IdCliente, Clientes.NmCliente, Clientes.ClassCliente, Seguradora.codigo, Seguradora.Seguradora, Clientes_Apolices.Empresa, Empresa.NmEmpresa, ClassSinCob.DescCobert, Status.DescStatus, Sinistro.[dt evento] AS DtEvento, Sinistro.[dt aviso] AS DtAviso FROM ((((((Sinistro INNER JOIN Clientes_Apolices ON (Sinistro.Empresa = Clientes_Apolices.Empresa) AND (Sinistro.IdApolice = Clientes_Apolices.IdApolice)) INNER JOIN Apolice ON Clientes_Apolices.IdApolice = Apolice.IdApolice) INNER JOIN Seguradora ON Apolice.codigo = Seguradora.codigo) INNER JOIN Clientes ON Clientes_Apolices.IdCliente = Clientes.IdCliente) INNER JOIN (SELECT Sinistro, CodCobert, DescCobert FROM (SELECT Sinistro, Min(TipoCoberturas.SeqLogica) AS MinSeqLogica FROM TipoCoberturas INNER JOIN [Sinistros Cobertura] ON TipoCoberturas.CodCobert = [Sinistros Cobertura].CodCobert GROUP BY Sinistro) AS TpSinistroCOB INNER JOIN TipoCoberturas ON TpSinistroCOB.MinSeqLogica = TipoCoberturas.SeqLogica ORDER BY TpSinistroCOB.Sinistro) AS ClassSinCob ON Sinistro.sinistro = ClassSinCob.Sinistro) INNER JOIN Status ON Sinistro.Status = Status.Status) INNER JOIN Empresa ON (Clientes_Apolices.Empresa = Empresa.Empresa) AND (Clientes_Apolices.IdApolice = Empresa.IdApolice) WHERE Sinistro.sinistro = '12745816' ORDER BY Sinistro.sinistro;
Sei que é difícil analisar sem o BD, mas se alguém tiver alguma dica, já ajudaria bastante!!!
Já estou perdendo o pouco cabelo que tenho!!!!
hahahahahahahahahaha
Abraço a todos!!!
- Editado CrisMaleta01 segunda-feira, 20 de junho de 2016 20:13
Respostas
-
Olá.
Pelo erro, você está usando ORDER BY em uma subquery. Isso não é permitido.
Mantenha somente o último ORDER BY que aparece em sua query.
- Editado Rafael Juca segunda-feira, 20 de junho de 2016 19:15
Todas as Respostas
-
-
OPAAA!!
Fala povo!!!
Acho que não faz diferença, mas a consulta será executada direto pelo VBA!!!
Rodei esta consulta pelo execute no ambiente VBA e no SQL Management e o retorno é o mesmo!!!
Erro em tempo de execução '-2147217900 (80040e14)': The ORDER BY clause is invalid in view, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also especified.
Desde já agradeço!!!
Abraço!!
-
Olá.
Pelo erro, você está usando ORDER BY em uma subquery. Isso não é permitido.
Mantenha somente o último ORDER BY que aparece em sua query.
- Editado Rafael Juca segunda-feira, 20 de junho de 2016 19:15
-
Fala Juca!!
Estava achando que o problema era este mesmo... mas o problema, é que a base da consulta é uma consulta agrupada!!!
Esse rolo, consiste em 3 consultas dependentes.... Preciso agrupar alguns dados para depois gerar uma consulta e por fim, gerar a consulta final...
Existira uma forma de fazer essa consulta funcionar???
Desde já agradeço!!!
Abraço....
-
-
-
CrisMaleta01
Realmente o seu problema esta na sua sub query, mas aconselho vc usar a cláusula UNION para agrupar as tabelas, segue um exemplo;
http://www.devmedia.com.br/conceitos-e-exemplos-praticos-union-e-subquery-sql-server-2008-parte-1/19166
- Editado Renato B Lima segunda-feira, 20 de junho de 2016 20:25
-
Vlw Renato!!!
Você acha que utilizando UNION melhora a questão do desempenho ou seria apenas mais uma forma de fazer a consulta???
Pensei em jogar essa consulta como uma procedure....
Alguém sabe se isso melhor alguma coisa???
Desde já agradeço!!!
Abraço...
-
Bom dia CrisMaleta01
Em questão performance vai depender do volume de dados da query e de vários outros fatores físico como harder etc.. se a intenção é jogar na maquina do cliente, como vc citado acima que precisaria agrupar os dados no final em apenas uma consulta, acho que o UNION vai lhe atender bem. Se no caso a intenção é ter um servidor dedicado (especifico) pode-se exigir um pouco mais do banco, ainda mais o sql server que é bem robusto. A procedure também resolve seu problema mas dever se levado em consideração o que eu disse antes, principalmente se quiser usar somente o sdf que não executa esse tipo de procedimento. Bem é isso, espero te contribuído.
Abraços