Mais

ArcGIS javascript API setDefinitionExpression retorna conjunto de resultados incorreto

ArcGIS javascript API setDefinitionExpression retorna conjunto de resultados incorreto


Novo em GIS e ArcGIS.

Estou tentando usar o setDefinitionExpression da API javascript para limitar a saída de um FeatureLayer no mapa; no entanto, o conjunto de resultados retornado pela função está incorreto. A função retorna apenas um conjunto de resultados, mas quando tento executar a mesma consulta no servidor ArcGIS ou no servidor de banco de dados, há 6 resultados.

Alguém sabe por que isso acontece?

Estou usando o SQL Server 2012 e a seguir está o código que estou usando:

var layer1 = new FeatureLayer (path + "/ arcgis / rest / services / MammalDistributionMapOIMap / MapServer / 0", {outFields: ["*"], opacidade: 0,5}); var speciesID = document.getElementById ("speciesID"). value; stringquery = "species_id =" + speciesID; layer1.setDefinitionExpression (stringquery);

Finalmente descobri o que pode causar o problema, pois agora minha consulta retorna corretamente e a camada é mostrada.

var layer1 = new FeatureLayer (path + "/ arcgis / rest / services / MammalDistributionMapOIMap / MapServer / 0", {opacidade: 0,5});

Ao remover ooutFields ["*"]a partir do código, toda a camada é mostrada quando nenhuma expressão de definição é configurada e os dados corretos são mostrados quando uma expressão de definição é configurada.

Não sei por que é o caso, pode ser que alguém com mais experiência possa responder.


ATUALIZAÇÃO 06-01-2017 16:17 EST

Se houver mais de 1 linha com o mesmo preço mínimo para um determinado código, você deve pegar a consulta, torná-la uma subconsulta, juntá-la para recuperar a id mínima para cada (código, preço) e juntá-la de volta ao produto por id :

Advertência: se houver laços (ou seja: o mínimo (preço) aparece em mais de uma linha por grupo), todas as linhas serão retornadas. Se, em caso de empate, você quiser outro comportamento, as coisas ficam um pouco mais complicadas. um segundo critério de escolha é necessário (se possível, um que não pode obter outro empate) e outro nível de subconsulta.

Você pode verificar esta consulta também @ SQLFiddle

Você pode verificar todas as explicações do @RolandoMySQLDBA para todas as coisas "fora do padrão" que estão por trás de GROUP BY em mySQL. Pode ser facilmente complicado.

A pergunta é antiga, mas como não vi respostas com abordagens diferentes, decidi responder com uma alternativa mais simples (sem usar joins).

O agrupamento unifica os registros com os mesmos valores registrados na instrução GROUP BY. Quando o MySQL faz isso, ele escolhe um registro para manter (não determinístico). Imagine que ele mantém uma linha e descarta as outras, mantendo apenas o valor da instrução MIN, até completar um grupo, e assim por diante.

Em vários testes, o MySQL sempre escolheu os valores da primeira linha enquanto o MariaDB manteve a última. Não há referência a isso no documento e apenas diz que o servidor é livre para escolher qualquer valor para cada grupo.

Para resolver isso, basta criar uma tabela (ou subquerys) temporária, ordenando a coluna a ser utilizada com MIN em ASC ou DESC, de acordo com o registro que é mantido (superior ou inferior) e a coluna a ser agrupada. Então, em uma seleção, use o agrupamento com o comando MIN.


Você enviou a consulta errada ao banco de dados. Você acessou uma extensão do mysql descrita no manual. Uma consulta como

não funcionará no SQL padrão. Ele gera um erro no Oracle (mensagem de erro: "ORA-00937: não é uma função de grupo único"), no MSSqlServer 2012 (mensagem de erro: "A coluna 'employee.city' é inválida na lista de seleção porque não está contida em uma função agregada ou na cláusula GROUP BY ") ou postgresql (mensagem de erro:" ERROR: a coluna "employee.city" deve aparecer na cláusula GROUP BY ou ser usada em uma função agregada ").

Em expressões SQL padrão na lista de seleção podem ser apenas expressões de colunas que também são usadas na cláusula group by e de funções agregadas. Os valores de uma coluna usados ​​na cláusula group by são iguais para todas as linhas desse grupo. O agregado também é exclusivo para um grupo. O select retorna uma linha para cada grupo contendo esses valores definidos exclusivamente para um grupo.

Se a consulta agregada não tiver uma cláusula group by, haverá apenas um grupo de linhas.

O padrão não permite o uso de uma coluna arbitrária na lista de seleção de uma consulta agregada porque seu valor não é definido exclusivamente: a coluna tem valores diferentes para as linhas da consulta, então qual deve ser retornado para este grupo pela consulta?

No mysql, há a extensão de que se houver uma coluna em uma expressão (não uma em uma expressão de função agregada) que não está na cláusula group by, o valor retornado pela instrução select para este grupo é o valor desta coluna de um linha arbitrária deste grupo.

retorna a soma dos salários de todos os funcionários e a cidade de uma dessas linhas. Mas a consulta retorna exatamente um reow porque é uma consulta agregada e há apenas um grupo que contém todos os registros da tabela de funcionários.

retorna uma linha para cada cidade com a cidade e dos salários de cada cidade.

retorna arow para cada cidade com e salaty de um funcionário arbitrário desta cidade. O servidor decide qual funcionário de uma cidade é escolhido.

também retorna uma linha para cada cidade com o código postal desta cidade. Se assumirmos que cada cidade possui apenas um CEP, então as linhas de cada grupo definido por uma cidade conterão o mesmo CEP. portanto, independente da linha que o servidor seleciona, o zicode reajustado sempre será o CEP da cidade.

No SQL padrão, esta consulta seria escrita como

para criar o resultado esperado

grupo por cidade, código postal e cidade de grupo definem os mesmos grupos por causa da correspondência um a um entre zipcdoe uma cidade.


API de critérios: selecione a expressão SE [NÃO] NULO & ltvalue & gt

Estou tentando traduzir a seguinte consulta simples na API de critérios JPA:

  1. Usando critériosBuilder.function ("ISNULL", Boolean.class, ticketAction.get (TicketAction_.ticketId)): o problema é que não há negação se ISNULL como ISNOTNULL (para um banco de dados MySQL / MariaDB)
  2. Usando critériosBuilder.isNotNull (ticketAction.get (TicketAction_.ticketId)): mas isso retorna um Predicado, enquanto a instrução select aceita apenas Expressões s

Objetivo de expansão: o mesmo com GROUP BY ticket.ticket_id IS NOT NULL


1 resposta 1

Porque você tem uma junção implícita da organização para si mesma, e no hibernate as junções implícitas são junções internas:

A forma implícita não usa a palavra-chave join. Em vez disso, as associações são "desreferenciadas" usando a notação de ponto. junções implícitas podem aparecer em qualquer uma das cláusulas HQL. resultado de junção implícita em junções internas na instrução SQL resultante.

Tente junções à esquerda explícitas, por exemplo:

(NOTA: Presumi que a organização. Organização é um relacionamento de pais. Se não for esse o caso, você pode (e deve) substituir os aliases dos pais e dos avós por algo mais apropriado)

EDITADO PARA ADICIONAR:

Parece que o que está acontecendo é que a junção interna está excluindo org com id de 1, provavelmente porque org com id de 1 tem uma organização nula