Viac

ArcGIS javascript API setDefinitionExpression vracia nesprávnu sadu výsledkov


Novinka v GIS a ArcGIS.

Snažím sa použiť javascript API setDefinitionExpression na obmedzenie výstupu FeatureLayer na mapu; sada výsledkov vrátená funkciou je však nesprávna. Funkcia vracia iba jednu sadu výsledkov, ale keď sa pokúsim spustiť rovnaký dotaz na serveri ArcGIS alebo databázovom serveri, zobrazí sa 6 výsledkov.

Vie niekto, prečo je to tak?

Používam SQL Server 2012 a používam nasledujúci kód:

var vrstva1 = nová FeatureLayer (cesta + "/arcgis/rest/services/MammalDistributionMapOIMap/MapServer/0", {outFields: ["*"], krytie: 0,5}); var speciesID = document.getElementById ("speciesID"). hodnota; stringquery = "species_id =" + ID druhu; layer1.setDefinitionExpression (stringquery);

Nakoniec som zistil, čo môže spôsobiť problém, pretože teraz sa môj dotaz vráti správne a vrstva sa zobrazí.

var vrstva1 = nová FeatureLayer (cesta + "/arcgis/rest/services/MammalDistributionMapOIMap/MapServer/0", {opacita: 0,5});

Odstránením súboruoutFields ["*"]z kódu sa zobrazí celá vrstva, ak nie je nastavený žiadny definičný výraz, a keď sa nastaví definičný výraz, zobrazia sa správne údaje.

Nie ste si istí, prečo to tak je, môže na to odpovedať niekto, kto má viac skúseností.


AKTUALIZÁCIA 06. 01. 2017 16:17 EST

Ak existuje viac ako 1 riadok s rovnakou minimálnou cenou pre daný kód, urobili ste dopyt, urobíte z neho poddotaz, spojíte ho a načítate minimálny identifikátor pre každý (kód, cena) a spojíte ho späť k produktu podľa ID. :

Upozornenie: ak existujú kravaty (t. j. min (cena) sa zobrazuje vo viac ako jednom riadku na skupinu), vrátia sa všetky riadky. Ak v prípade nerozhodného výsledku chcete iné správanie, veci sa trochu skomplikujú. je potrebné kritérium druhej voľby (ak je to možné, také, ktoré nemôže získať ďalšie remízy) a ďalšia úroveň poddotazovania.

Tento dotaz môžete skontrolovať aj na @ SQLFiddle

Môžete skontrolovať všetky vysvetlenia @RolandoMySQLDBA pre všetky „neštandardné“ veci, ktoré v mySQL zaostávajú za SKUPINOU. Ľahko to môže byť zložité.

Otázka je stará, ale keďže som nevidel odpovede s rôznymi prístupmi, rozhodol som sa odpovedať jednoduchšou alternatívou (bez použitia spojení).

Zoskupenie zjednocuje záznamy s rovnakými hodnotami zaznamenanými vo výkaze GROUP BY. Keď to MySQL urobí, vyberie záznam, ktorý sa má udržiavať (nedeterministický). Predstavte si, že drží jeden riadok a ostatné zahodí, pričom ponechá iba hodnotu inštrukcie MIN, kým nedokončí skupinu a podobne.

V niekoľkých testoch si MySQL vždy vybral hodnoty prvého riadku, zatiaľ čo MariaDB ponechal posledný. V dokumente sa o tom nehovorí a hovorí sa v ňom, že server si môže slobodne vybrať akúkoľvek hodnotu pre každú skupinu.

Ak to chcete vyriešiť, jednoducho vytvorte dočasnú tabuľku (alebo subquery) a objednajte stĺpec, ktorý sa má použiť s MIN v ASC alebo DESC, podľa záznamu, ktorý sa uchováva (horný alebo dolný) a stĺpca, ktorý sa má zoskupiť. Potom pri výbere použite zoskupenie s príkazom MIN.


Odoslali ste nesprávny dotaz do databázy. Stlačili ste rozšírenie mysql, ktoré je popísané v príručke. Dotaz ako

nebude fungovať v štandardnom SQL. Vyvoláva chybu v systéme Oracle (chybové hlásenie: „ORA-00937: nie je to funkcia skupiny skupiny“), v MSSqlServer 2012 (chybové hlásenie: „Stĺpec‚ employee.city ‘je vo výberovom zozname neplatný, pretože nie je obsiahnutý buď v súhrnnej funkcii, alebo v klauzule GROUP BY “) alebo postgresql (chybové hlásenie:„ CHYBA: stĺpec „employee.city“ sa musí objaviť v klauzule GROUP BY alebo sa musí použiť v súhrnnej funkcii ”).

V štandardných výrazoch SQL môžu byť vo výberovom zozname iba výrazy stĺpcov, ktoré sa používajú aj v skupine podľa klauzuly, a súhrnných funkcií. Hodnoty stĺpcov, ktoré sa používajú v skupine podľa klauzuly, sú rovnaké pre všetky riadky v tejto skupine. Agregát je tiež jedinečný pre skupinu. Výber vráti jeden riadok pre každú skupinu obsahujúci tieto jedinečne definované hodnoty pre skupinu.

Ak agregovaný dotaz nemá skupinu podľa klauzuly, potom je iba jedna skupina riadkov.

Štandard nepovoľuje použitie ľubovoľného stĺpca vo výberovom zozname súhrnného dotazu, pretože jeho hodnota nie je jednoznačne definovaná: stĺpec má pre riadky dotazu rôzne hodnoty, takže ktorá by mala byť dotazom vrátená pre túto skupinu?

V mysql existuje rozšírenie, že ak je vo výraze stĺpec (nie je v súhrnnom funkčnom výraze), ktorý nie je v skupine podľa klauzuly, hodnota vrátená príkazom select pre túto skupinu je hodnotou tohto stĺpca ľubovoľný riadok tejto skupiny.

vráti súčet platov všetkých zamestnancov a mesta jedného z týchto riadkov. Dotaz však vracia presne jedno opätovné zaradenie, pretože ide o agregovaný dotaz a existuje iba jedna skupina, ktorá obsahuje všetky záznamy z tabuľky zamestnancov.

vráti riadok pre každé mesto s mestom a s platmi každého mesta.

návratky za každé mesto so mzdou ľubovoľného zamestnanca tohto mesta. Server rozhodne, ktorý zamestnanec mesta je vybraný.

tiež vrátiť riadok pre každé mesto s PSČ tohto mesta. Ak predpokladáme, že každé mesto má iba jeden PSČ, než riadky každej skupiny definovanej mestom obsahujú rovnaké PSČ. server teda nezávisle na riadku vyberie preladený zicode, pričom vždy bude PSČ mesta.

V štandardnom SQL by bol tento dotaz napísaný ako

vytvoriť očakávaný výsledok

skupina podľa mesta, PSČ a skupina mesto definujú rovnaké skupiny kvôli korešpondencii medzi mestami zipcdoe a jedna k jednej.


Kritériá API: Vyberte výraz, AK [NIE] NULL & ltvalue & gt

Pokúšam sa preložiť nasledujúci jednoduchý dotaz do rozhrania API kritérií JPA:

  1. Použitie kritériaBuilder.function ("ISNULL", Boolean.class, ticketAction.get (TicketAction_.ticketId)): Problém je v tom, že neexistuje žiadna negácia, ak ISNULL ako ISNOTNULL (pre databázu MySQL/MariaDB)
  2. Použitie kritériaBuilder.isNotNull (ticketAction.get (TicketAction_.ticketId)): ale toto vráti predikát, zatiaľ čo príkaz select akceptuje iba výraz s

Úsek strečingu: To isté s GROUP BY ticket.ticket_id NIE JE NULL


1 odpoveď 1

Pretože máte implicitné pripojenie od samotnej organizácie a v režime dlhodobého spánku sú implicitné pripojenia vnútorné spojenia:

Implicitný formulár nepoužíva kľúčové slovo join. Namiesto toho sa asociácie „odreferujú“ pomocou bodovej notácie. implicitné pripojenia sa môžu objaviť v ktorejkoľvek z klauzúl HQL. implicitné spojenie má za následok vnútorné spojenia vo výslednom príkaze SQL.

Skúste explicitné ľavé spojenie, napr .:

(POZNÁMKA: Predpokladal som, že organizácia. Organizácia je rodičovský vzťah. Ak to tak nie je, môžete (a mali by ste) nahradiť prezývky rodiča a prarodiča niečím vhodnejším)

UPRAVENÉ NA PRIDANIE:

Zdá sa, že sa deje to, že vnútorné spojenie vylučuje org s id 1, pravdepodobne preto, že org s id 1 má nulovú organizáciu