Select Max value arcpy<\/A>, stejné otázky na GeoNet, která mě přiměla k výzkumu tohoto problému před několika měsíci. Začněme se dvěma základními tabulkami (TableA a TableB), které mají každá textové a celočíselné pole, a jedna tabulka obsahuje podmnožinu záznamů z druhé tabulky.<\/P>
<\/P>
<\/P>
>><\/>><\/> fgdb =<\/> # cesta k file geodatabase<\/>>><\/>><\/> pgdb =<\/> # cesta k personal geodatabase<\/>>><\/>><\/> egdb =<\/> # cesta k enterprise geodatabase, v příkladu použit SQL Server<\/>>><\/>><\/> gpkg =<\/> # cesta k GeoPackage<\/>>><\/>><\/> gdbs =<\/> (<\/>fgdb,<\/> pgdb,<\/> egdb,<\/> gpkg)<\/> >><\/>><\/>
>><\/>><\/> values =<\/> (<\/>(<\/>"A" , 1), ("A", 2), ("B", 1), ("B", 2),
. . . ("C", 2), ("C", 3), ("D", None), ("E", 1))
. . .
>>> table_names = ("TableA", "TableB")
>>>
>>>
)<\/SPAN>:<\/SPAN>
.<\/SPAN>.<\/SPAN>.<\/SPAN> table =<\/SPAN> arcpy.<\/SPAN>CreateTable_management(<\/SPAN>gdb, <\/SPAN>table_names[<\/SPAN>i-1<\/SPAN>]<\/SPAN>)<\/SPAN>
.<\/SPAN>.<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>AddField_management(<\/SPAN>table, <\/SPAN>"id"<\/SPAN>, <\/SPAN>"TEXT"<\/SPAN>)<\/SPAN>
.<\/SPAN>.<\/SPAN>.<\/SPAN> arcpy.<\/SPAN>AddField_management(<\/Span>table, <\/Span>"version"<\/Span>, <\/Span>"LONG"<\/Span>)<\/Span>
.<\/Span>.<\/Span>.<\/Span> with<\/Span> arcpy.<\/Span>da.<\/Span>InsertCursor(<\/Span>table, <\/Span>("id"<\/Span>, "version"<\/Span>))<\/Span> as<\/Span> cur:<\/Span>
.<\/Span>.<\/Span>.<\/Span> for<\/Span> value in<\/Span> values[::i]:
... cur.insertRow(value)
...
... qry = ("EXISTS (SELECT 1"
" FROM TableB"
" WHERE TableB.id = TableA.id"
" AND TableB.version = TableA.version)")
table_view = arcpy.MakeTableView_management(table, "table_view", qry)
print arcpy.GetCount_management(table_view)
arcpy.Delete_management(table_view)
0
3
3
3
>> > </</ span >< span >< EM O J I _ 31 > </ span >< span >< EM O J I _ 32 > </ span >< span >< EM O J I _ 33 > </ span ></ span ></ CODE ></ PRE >< P >< / P >< P > Ukázkový kód výše vytváří dvě základní tabulky v souborové geodatabázi, osobní geodatabázi, podnikové geodatabázi (< EM > Použil jsem SQL Server < / EM >) a < A href = "http://www.geopackage.org/" rel = "nofollow noopener noreferrer" target = "_blank" > GeoPackage < / A >. Kód pak vytvoří pohled na tabulku pro každou z geodatabází pomocí EXISTS s jednoduchým korelovaným poddotazem pro výběr záznamů z TableA, které mají odpovídající < SPAN style = "font-family: courier new,courier,monospace;" > id < / SPAN > a < SPAN style = "font-family: courier new,courier,monospace;" > version < / SPAN > v TableB. Správný pohled na tabulku je zobrazen na snímku obrazovky výše. Z výsledků kódu lze vidět, že ze souborové geodatabáze nejsou vráceny žádné záznamy. < / P >< P >< / P >< P > Proč tedy souborová geodatabáze nevrací žádné záznamy? Nepodporují se poddotazy? Vzhledem k tomu, že dokumentace k EXISTS zmiňuje poddotazy, zdá se, že musí být podporovány alespoň do určité míry. Podívejme se blíže na sekci < A href = "https://desktop.arcgis.com/en/arcmap/latest/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm#GUID-F5320DB5-4E54-4D49-BF31-A58F5379ED9F" rel = "nofollow noopener noreferrer" target = "_blank" > Poddotazy < / A > v rámci < A href = "https://desktop.arcgis.com/en/arcmap/latest/map/working-with-layers/sql-reference-for-query-expressions-used-in-arcgis.htm" rel = "nofollow noopener noreferrer" target = "_blank" > SQL reference for query expressions used in ArcGIS < / A > : < / P >< BLOCKQUOTE class = "jive_macro_quote jive-quote jive_text_macro" >< H2 style = "margin: 0.24em 0px 0.62em; color: #4d4d4d; text-transform: none; line-height: 1.2em; text-indent: 0px; letter-spacing: 0.02em; font-family: 'Avenir LT W01 35 Light', Arial, Helvetica, sans-serif; font-size: 2rem; font-style: normal; font-weight: 500; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; -webkit-font-smoothing: antialiased; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px;" id = "toc-hId-1824851517" id = "toc-hId-1824851517" > Poddotazy < / H2 >< H5 style="margin: 0px 0px 0.63em; padding: 0px 1rem 0px 0.5em; width: 91px; line-height: 1.5em; letter-spacing: 0.02em; font-family: 'Avenir LT W01 65 Medium', Arial, Helvetica, sans-serif; font-size: 0.87rem; font-style: normal; font-weight: 500; float: left; white-space: nowrap; position: relative; box-sizing: border-box; -webkit-font-smoothing: antialiased;" id="toc-hId--1316845959" id="toc-hId--1316845959">Poznámka:<\/H5>Pokrytí, shapefiles a jiné datové zdroje založené na souborech mimo geodatabázi nepodporují poddotazy. Poddotazy prováděné na verzovaných ArcSDE feature classes a tabulkách nevrátí prvky uložené v delta tabulkách. File geodatabases poskytují omezenou podporu pro poddotazy vysvětlenou v této sekci, zatímco personal a ArcSDE geodatabases poskytují plnou podporu. Pro informace o plném rozsahu schopností poddotazů v personal a ArcSDE geodatabases se obraťte na dokumentaci vašeho DBMS.<\/P><\/DIV><\/P><\/P><\/P><\/P>Poddotaz je dotaz vložený do jiného dotazu. Může být použit k aplikaci predikátových nebo agregačních funkcí nebo ke srovnání dat s hodnotami uloženými v jiné tabulce....<\/P><\/BLOCKQUOTE><\/P>Podpora poddotazů v file geodatabases je omezena na následující:<\/P>IN predikát. Například:<\/LI><\/UL>"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)<\/PRE>Skalární poddotazy s porovnávacími operátory. Skalární poddotaz vrací jedinou hodnotu. Například:<\/LI><\/UL>"GDP2006" > (SELECT MAX("GDP2005") FROM countries)<\/PRE>Pro file geodatabases lze množinové funkce AVG, COUNT, MIN, MAX a SUM použít pouze ve skalárních poddotazech.<\/SPAN><\/P>EXISTS predikát. Například:<\/LI><\/UL>EXISTS (SELECT * FROM indep_countries WHERE "COUNTRY_NAME" = 'Mexico')<\/PRE><\/BLOCKQUOTE><\/P>Dokumentace uvádí „omezenou podporu“ pro poddotazy, ale také uvádí, že EXISTS predikát je podporován. Pokud poddotazy nejsou problém, možná problém jsou korelované poddotazy. Koneckonců žádný z EXISTS příkladů v celé dokumentaci nepoužívá korelovaný poddotaz. Bohužel hádání je to, co nám zbývá, protože korelované poddotazy nejsou explicitně zmíněny v žádné dokumentaci file geodatabáze, kterou mohu najít.<\/P><\/P>Z tohoto jednoduchého příkladu je jasné, že file geodatabase dává nesprávné výsledky při použití EXISTS s korelovanými poddotazy. Jsou nesprávné výsledky chybou nebo omezením podpory SQL ve file geodatabase? I kdyby někdo chtěl argumentovat tím druhým, stále tu je problém uživatele dostávajícího správné výsledky místo chybové zprávy, což by mělo být to, co uživatel dostane, pokud korelované poddotazy nejsou podporovány.<\/P><\/BODY><\/HTML>