![ç»å](https://habrastorage.org/webt/sl/ch/fp/slchfpm_a-deoh62fqiazjgdc5k.png)
èšäºã®å 容ãã€ãŸããã®ååãæå³ãããã®ã
ããã«ãèè ã¯ããã圌ã®èŠ³ç¹ãããªãå¿ èŠãªã®ãã説æããSUBJã¯åãªããã¡ãã·ã§ããã«ãªãã¯ãããžãŒã§ã¯ãªãããäºéã«å¿ èŠãªããžãã¹-å¿«é©ã§äŸ¿å©ãªãã®ãã§ããããšãäŒããŸãã
äœäººãã®æèœãã人ã ãã©ã®ããã«äœããããã®ãïŒããã°ã©ãã³ã°èšèªããªãããã§ã¯ãªãã®ãïŒã圌ãã解決ããããšããŠããåé¡ãšåœŒããèªåã§èšå®ããã¿ã¹ã¯ãæ£ç¢ºã«ç¥ã£ãŠããã®ãèŠãã®ã¯åžžã«èå³æ·±ãã ãŸããèªåã§äœæããã¹ãããŸãã å®å®ã®èª¿åã®ç¶æãæåç·ã«çœ®ããŠãã巚倧å§å¡äŒã®èšå¿µç¢çãªåµé ç©ãšæ¯èŒããªãã§ãã ããã
ããšãã°ã FORTRANãšPL / 1ã®éåœãæ¯èŒããŠãã ããã ãã®PL / 1ã«ã€ããŠèª°ãä»èŠããŠããã§ãããã
ãã®èŠ³ç¹ãããããšãã°AWKã¯éåžžã«æåããŠããŸãã ãã©ãŽã³ããã¯ã®èè ã®äžäººã§ãã圌ã®ã¿ã€ãã«Aã¯ã¢ã«ãã¬ããã»ã¢ãã§ãããWã¯Fortran-77ã«æãæºããããŒã¿ãŒã»ã¯ã€ã³ããŒã¬ãŒã§ãããKã¯ãã©ã€ã¢ã³ã»ã«ãŒãã¬ã³ã§ããã圌ã¯åœŒãªãã§ãããšèšã䟡å€ããããŸãã ãã®èšèªã¯ãããã»ã¹éã®ãã€ãã§ãªã³ã¶ãã©ã€ã®ããã¹ãã¹ããªãŒã ãåŠçããããšãç®çãšããŠããŸãã
èšèªã¯ã¿ã€ãã¬ã¹ã§ãïŒ ããã¯å®å šã«çå®ã§ã¯ãããŸãã ïŒãæ§æã¯Cã«éåžžã«äŒŒãŠããããã£ã«ã¿ãªã³ã°æ©èœãé£æ³é åãã¹ããªãŒã ã®éå§/çµäºã®ã€ãã³ããæ¹è¡ã€ãã³ãããããŸã...
äœæè ã¯ããã®èšèªã«ã€ã³ã¿ããªã¿ãã€ã³ã¹ããŒã«ããå¿ èŠããªããåžžã«UNIXã©ã€ã¯ãªã·ã¹ãã ã«ååšããWindowsã§ã¯å®è¡å¯èœãã¡ã€ã«ãã³ããŒããã ãã§ååã§ãããšããäºå®ã«ãæéãåããŠããŸãã ãã ããããã§ã¯ãããŸããã
ãã®éçšã§ãèè ã¯ããªãé »ç¹ã«SQL + AWKãã³ãã«ã䜿çšããå¿ èŠãããããã®ããã§ãã SQLã¯ãããŒã¿ãããŒãå¶åŸ¡ããããã«èšèšãããæåã®å®£èšåèšèªã®ãŸãŸã§ãã éèšé¢æ°ã®åœ¢åŒã§ã¯ãšãªå®è¡ã®ã³ã³ããã¹ããæäœããæ©äŒã¯éåžžã«éãããŠããŸãã
ããšãã°ãSQLã䜿çšããŠ2次å ã®ãã¹ãã°ã©ã ãäœæããæ¹æ³ã¯ïŒ
-- 100 x 100 SELECT count(), round(x, -2) AS cx, round(y, -2) AS cy FROM samples GROUP BY cx, xy
ãã ããGROUP BYã®äœ¿çšã¯äžŠã¹æ¿ããæå³ãã1åè¡ïŒãŸãã¯ãã以äžïŒã®è¡ãããå Žåãããã¯å®æãªåã³ã§ã¯ãããŸããã
UPDïŒã³ã¡ã³ãã§ãããã¯ããã§ã¯ãªãïŒãŸãã¯ãŸã£ãããªãïŒãšç§ã«ä¿®æ£ããŸãã
èŠçŽïŒSQLããã»ããµãŒã¯ãGROUP BYã®åŸã®ã°ã«ãŒãæ°ãæšå®ã§ããªãå ŽåããœãŒãã«é ŒããŸãã ãã ããèšç®å€ã«ããã°ã«ãŒãåã¯ïŒå€ãã®å ŽåïŒãŸãã«ãã®ã±ãŒã¹ã§ãã
SQLããã»ããµã«ã¯ãã°ã«ãŒãååºæºã«åŸã£ãŠããã·ã¥ãæ§ç¯ããããã»ã¹ã§éçŽé¢æ°ãå®è¡ããæ©èœããããŸãã ãããè¡ãã«ã¯ãããã·ã¥ããããã¡ã¢ãªã«é
眮ããã®ã«ååãªç©ºãã¡ã¢ãªãå¿
èŠã§ãã
ãã®åŸãããŒãã«ã®èªã¿åãæã«ã°ã«ãŒãã®ã³ã³ããã¹ããæŽæ°ããããã®èªã¿åãã®çµããã«ãã§ã«èšç®çµæãåŸãããŸãã
åãææ³ããŠã£ã³ããŠé¢æ°ïŒäžèšïŒã«æ¡åŒµããããšãã§ããŸãããã³ã³ããã¹ãã ããã倪ãããªããŸãã
ã°ã«ãŒãã®æ°ãäºåã«äžæãŸãã¯éåžžã«å€§ããå ŽåãSQLããã»ããµã¯äžæã€ã³ããã¯ã¹ãäœæãã2åç®ã®ãã¹ã§å®è¡ããããšã匷å¶ãããŸãã
ããšãã°ã次ã®ãããªåçŽãªå Žå-åçŽãªCOUNTãæ®éçãªãªãã·ã§ã³ãå¯èœã§ã-äžæçãªã€ã³ããã¯ã¹ïŒcxãcyãcountïŒãå°æ°ã®ã°ã«ãŒãã§ã¯ããã£ãã·ã¥ãããããŒãžã®ãã¹ãŠã®ã¡ã¢ãªã«æ ŒçŽãããŸãã è€éãªå ŽåããŠã£ã³ããŠãæ©èœããå Žåãã°ã«ãŒãã®ç¶æ ã¯éèŠãªãã®ã«ãªããå»åž«ã泚æãããã®ã§ã¯ãªããåžžã«ã·ãªã¢ã«åãããŸãã
ãã®åŸãããŒãã«ã®èªã¿åãæã«ã°ã«ãŒãã®ã³ã³ããã¹ããæŽæ°ããããã®èªã¿åãã®çµããã«ãã§ã«èšç®çµæãåŸãããŸãã
åãææ³ããŠã£ã³ããŠé¢æ°ïŒäžèšïŒã«æ¡åŒµããããšãã§ããŸãããã³ã³ããã¹ãã ããã倪ãããªããŸãã
ã°ã«ãŒãã®æ°ãäºåã«äžæãŸãã¯éåžžã«å€§ããå ŽåãSQLããã»ããµã¯äžæã€ã³ããã¯ã¹ãäœæãã2åç®ã®ãã¹ã§å®è¡ããããšã匷å¶ãããŸãã
ããšãã°ã次ã®ãããªåçŽãªå Žå-åçŽãªCOUNTãæ®éçãªãªãã·ã§ã³ãå¯èœã§ã-äžæçãªã€ã³ããã¯ã¹ïŒcxãcyãcountïŒãå°æ°ã®ã°ã«ãŒãã§ã¯ããã£ãã·ã¥ãããããŒãžã®ãã¹ãŠã®ã¡ã¢ãªã«æ ŒçŽãããŸãã è€éãªå ŽåããŠã£ã³ããŠãæ©èœããå Žåãã°ã«ãŒãã®ç¶æ ã¯éèŠãªãã®ã«ãªããå»åž«ã泚æãããã®ã§ã¯ãªããåžžã«ã·ãªã¢ã«åãããŸãã
ãããã£ãŠã次ã®ãããªããšãããå¿ èŠããããŸãã
psql -t -q -c 'select x, y from samples' | gawk -f mk_hist2d.awk
mk_hist2d.awkã¯ãé£æ³é åã«çµ±èšãèç©ããäœæ¥ã®å®äºæã«çµ±èšã衚瀺ããŸã
# mk_hist2d.awk { bucket[int($2*0.01), int($3*0.01)]+=$1; } END { for (i=0; i < 500; i++) for (j=0; j < 500; j++) { if ((i, j) in bucket) print i*100." "j*100." "bucket[i, j]; else print i*100." "j*100." 0"; } }
ãã ãã1ã€ãããŸãããµãŒããŒããäœæ¥ãã·ã³ã«å®å šãªããŒã¿ã¹ããªãŒã ãéä¿¡ããå¿ èŠããããŸãããããã»ã©å®ãã¯ãããŸããã
SQLã¯ãšãªã®å®è¡äžã«ã䞊ã¹æ¿ãã«é Œããã«çµ±èšãèç©ããããã«ãäœããã®æ¹æ³ã§æ¥œãããã®ãšäŸ¿å©ãªãã®ãçµã¿åãããããšãã§ããŸããïŒ ã¯ããããšãã°ãã«ã¹ã¿ã éèšé¢æ°ã䜿çšããŸãã
ã«ã¹ã¿ã éèšé¢æ°
Subjã¯ããŸããŸãªã·ã¹ãã ã«ååšããã©ãã§ãç¬èªã®æ¹æ³ã§è¡ãããŸãã
- PostgreSQL ããã¥ã¡ã³ãã¯ãã¡ãã§ãã 詳现ã¯ãã¡ã ã
ããã¯ãæ倧å£åº§æ®é«ãèšç®ãããå Žæã§ãã
ãããŠãããã¯ããŒã«åã®è©³çŽ°ãèšç®ããäŸã§ã-trueãŸãã¯falseã
ãã®ããã«èŠããŸã-
CREATE AGGREGATE mode(boolean) ( SFUNC = mode_bool_state, STYPE = INT[], FINALFUNC = mode_bool_final, INITCOND = '{0,0}' );
ããã§ã SFUNCã¯ã¹ããªãŒã å ã®ãã¹ãŠã®è¡ã«å¯ŸããŠåŒã³åºãããé¢æ°ã§ãã
ãã®æåã®åŒæ°ã¯STYPEåã§ãã
FINALFUNCã¯ãèšç®ãå®äºããéèšã®å€ãè¿ãããã«äœ¿çšãããŸãã
INITCOND-æåã®åŒæ°ãšããŠæž¡ãããå éšç¶æ ã®åæå€ïŒ STYPE ïŒã®åæåã
é¢æ°ã¯Cã§èšè¿°ã§ããããšãèãããšïŒå éšç¶æ ã§ã¯ããªã¯ãšã¹ããéãããšèªåçã«è§£æŸãããã¡ã¢ãªã䜿çšã§ããããšãæå³ããŸãïŒãããã¯éåžžã«åŒ·åãªããŒã«ã§ãã ãã®äœ¿çšã®ç¯å²å€ã§ã¯ããŸã è¡ããªããã°ãªããŸããã - MS SQL
以å ïŒ2000幎ïŒããã®ãªããžã§ã¯ãã䜿çšããŠéèšãè¡ãã«ã¯ãActiveXãªããžã§ã¯ããäœæããèŠæ±ã®åã«å¿ èŠã§ããã
çŸåš ïŒ2016以éïŒãããã¯CLRç°å¢ã§è¡ãããŠããŸãã ã«ã¹ã¿ã é¢æ°ãäœæãã ã¢ã»ã³ããªãäœæããŠç»é²ããå¿ èŠããããŸãã ãã®åŸã éèšãäœæã§ããŸãã
幟äœå¹³åã®èšç®ãšæååã®ããŒãžã®äŸ ïŒè¿œå ã®ãã©ã¡ãŒã¿ãŒãšäžéç¶æ ãä¿åããããã®ãŠãŒã¶ãŒå®çŸ©åã䜿çšããŸãã - ãªã©ã¯ã«
Oracleã§ã¯ãããã¯ODCIAggregate Data Cartridge ïŒã€ã³ã¿ãŒãã§ãŒã¹ïŒã䜿çšããŠè¡ãããŸãã
ç¬èªã®éèšãäœæããã«ã¯ã4ã€ã®ã¡ãœãããå®è£ ããã«ã¹ã¿ã ã¿ã€ããèšè¿°ããå¿ èŠããããŸã
-åæåïŒODCIAggregateInitializeïŒãéçãç®çã®åã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããã©ã¡ãŒã¿ãŒãä»ããŠè¿ãå¿ èŠããããŸã
-ããŒã¿ã®åè¡ã§åŒã³åºãããå埩ïŒODCIAggregateIterateïŒ
-mergeïŒODCIAggregateMergeïŒã䞊è¡ããŠå®è¡ãããéçŽãããŒãžããããã«äœ¿çš
-çµäºïŒODCIAggregateTerminateïŒ-çµæåºå
äŸïŒ 1ã2ã3ã4 ã - DB2
DB2ã§ã«ã¹ã¿ã éèšã䜿çšããæ瀺çãªæ¹æ³ã¯ãããŸããã
ãã ããæšæºé¢æ°ïŒMAXã§ã¯ãããïŒããŠãŒã¶ãŒå®çŸ©åïŒJavaã®å ŽåïŒã«ã¹ãªããããã·ã¹ãã ã«ãã©ãŒã ã®ã¯ãšãªãå®è¡ãããããšãã§ããŸãã
CREATE TYPE Complex AS ( real DOUBLE, i DOUBLE ) ⊠CREATE TABLE complexNumbers ( id INTEGER NOT NULL PRIMARY KEY, number Complex ) ⊠SELECT sum..real, sum..i FROM ( SELECT GetAggrResult(MAX(BuildComplexSum(number))) FROM complexNumbers ) AS t(sum)
ããããã¹ãŠã®ã·ã¹ãã ã§æ³šç®ãã¹ãããšã¯äœã§ããïŒ
- äœããã®æ¹æ³ã§ãããŒã¿ããŒã¹ã«ãªããžã§ã¯ããäœæããå¿
èŠããããŸãã AGGREGATEãŸãã¯TYPEã«ãªããŸãã å°ãªããšããé©åãªæš©å©ãå¿
èŠã§ãã ãããŠã圌ã®èã«ããã€ãã®æ°åãè¿œå ãããã ãã§ãã
- CãCïŒãJavaãªã©ãå¥ã®èšèªã§äœããæžãå¿
èŠããããããããŸããã
ã·ã¹ãã ã«æžã蟌ãŸããå 容ãçµ±åããã«ã¯ãå床ãæš©éãå¿ èŠã§ãã ç§ã¯ãã ...
- åæåã®é£ããã ç°ãªããã¹ã±ãããµã€ãºã®ãã¹ãã°ã©ã ãèªã¿ãããšããŸãã ç°¡åã«æããŸã-éåäœïŒPostgreSQLïŒãšããžãã¹å
šäœã宣èšãããšãã«ãç®çã®INITCONDã瀺ããŸãã ãã ãããã¹ã±ããã®ãµã€ãºããšã«ãç¬èªã®éèšãå¿
èŠã«ãªããŸãããã®å Žåããæš©å©ãå¿
èŠã§ãã
ããã§ã¯ãããŒãã£ããªãã¯ã«é Œã£ãŠãåæåè¡ïŒãã©ã¯ãŒãïŒãšããŒã¿ãããŠããªã³ããã»ããµãã¹ãªããããã³ã³ã¹ãã©ã¯ã¿ã§ã¯ãªããæåã®è¡ãåãåã£ããšãã«ã³ã³ããã¹ããæ§ç¯ã§ããŸãã
- ããã§ãã説æãããŠããå¶éããã£ãŠããã«ã¹ã¿ã éèšã䜿çšãããšãäœã§ãèšç®ã§ããŸãã
- å°ãªããšãPostgreSQLã§éèšã䞊ååã§ããããšãéèŠã§ãããOracleïŒEnterprise EditionïŒããããå®è¡ã§ããŸãã ãã®ããã«ã¯ãäžéç¶æ ãã·ãªã¢ã«å/éã·ãªã¢ã«åããæ¹æ³ãåŠç¿ããç°ãªãã¹ããªãŒã ããåä¿¡ããç¶æ ãããªãŒãºããå¿ èŠããããŸãã
ãŠã£ã³ããŠé¢æ°
ãŠã£ã³ããŠé¢æ°ã¯SQLïŒ2003æšæºã«ç»å ŽããŸããã çŸæç¹ã§ã¯ãäžèšã®ãã¹ãŠã®ã·ã¹ãã ã§ãµããŒããããŠããŸãã æ¬è³ªçã«ããŠã£ã³ããŠé¢æ°ã¯ãŠãããã䜿çšããäœæ¥ã®æ¡åŒµã§ãã ãããŠããã¡ãããã«ã¹ã¿ã éèšé¢æ°ããŠã£ã³ããŠã³ã³ããã¹ãã§æ©èœããŸãã
æ¡åŒµåã¯ããã§ãã SQLïŒ2003以åã¯ãéèšé¢æ°ã¯ç¹å®ã®ãŠã£ã³ããŠã§æ©èœããŸãããããã¯ãGROUP BYåŒã®ãã£ãŒã«ãå€ã®çµã¿åããã«å¯Ÿå¿ããçµæã»ããå šäœãŸãã¯ãã®äžéšã®ããããã§ããã ãŠãŒã¶ãŒã¯ãã®ãŠã£ã³ããŠãèªç±ã«æäœã§ããããã«ãªããŸããã
éãã¯ããŠã£ã³ããŠã䜿çšããŠèšç®ãããå€ãå¥ã®åã®åºåã«è¿œå ãããéèšé¢æ°ã䜿çšããŠã¹ããªãŒã å šäœãæããããå¿ èŠããªãããšã§ãã ãã®ããã1ã€ã®èŠæ±ã§ãããããç¬èªã®ã³ã³ããã¹ãïŒãŠã£ã³ããŠïŒã§è€æ°ã®ãŠã£ã³ããŠéåã䜿çšã§ããŸãã 以åã¯ããã€ãã®éçŽé¢æ°ããããŸãããããããã¯ãã¹ãŠ1ã€ã®ãŠã£ã³ããŠã§æ©èœããŸããã
倧ããªã¹ãããŒã¯
- 以äžïŒïŒ
ãŠã£ã³ããŠã¯çµæã»ããå šäœã§ãã ã¯ãšãª ' select countïŒ1ïŒfrom Samples 'ã169ãè¿ããšããŸãããã®å Žåã ' select countïŒ1ïŒoverïŒïŒfrom Samples 'ãå®è¡ãããšã169å169åæžã蟌ãŸããåãåŸãããŸãã - ãªãŒããŒïŒããŒãã£ã·ã§ã³ãã€ïŒ
ããã¯GROUP BYã®é¡äŒŒç©ã§ãããå€ã®çµã¿åããããšã«ãéèšé¢æ°ãå®è¡ããããŠã£ã³ããŠãäœæãããŸãã SamplesããŒãã«ã§ã1ã€ã®æŽæ°åãvalã§ãããããŒã¿ã1ã169ã®æ°åã§ãããšããŸãã
次ã«ã ãµã³ãã«ããã¯ãšãª ' select countïŒ1ïŒoverïŒpartition byïŒ12 + valïŒ/ 13ïŒ 'ã¯ãå€13ã169åæžã蟌ãŸããåãè¿ããŸãã
- ãªãŒããŒïŒORDER BYïŒ
PARTITION BYãšçµã¿åãããããšãã§ããã«ãŒãœã«ã®éã«ãŠã£ã³ããŠã®ãµã€ãºãåçã«å€æŽã§ããŸãããã®å ŽåããŠã£ã³ããŠã¯ã°ã«ãŒãã®å é ããçŸåšã®ã«ãŒãœã«äœçœ®ãŸã§æ¡åŒµãããŸãã ãã®çµæãã°ã«ãŒãã¯éèšåã§åãå€ãååŸãããç¬èªã®å€ãååŸããŸãã 环ç©éé¡ã®èšç®ã«äŸ¿å©ã§ãã ã¯ãšãªçµæ
'Select sumïŒvalïŒoverïŒorder by valïŒfrom Samples 'ã¯ãnçªç®ã®èŠçŽ ã«1ããnãŸã§ã®èªç¶æ°ã®åèšãå«ãŸããåã«ãªããŸãã - ãªãŒããŒïŒè¡ïŒ
ã«ãŒãœã«äœçœ®ãŸãã¯ORDER BYç¯å²ã®éå§/çµäºããéå§ããŠããŠã£ã³ããŠãã¬ãŒã ãå®çŸ©ã§ããŸãã
ããšãã°ãã ... ROWS 1 PRECEDING ... ãã¯ããŠã£ã³ããŠãçŸåšã®è¡ãšãã®åã®1ã§æ§æãããããšãæå³ããŸãã A ... ... 1 FOLLOWINGãš2 FOLLOWING ... 'ã®é-ROWSã¯ãã«ãŒãœã«ã®çŽåŸã®2è¡ã§æ§æãããŠããŸãã
ãã®ã¢ãŒãã®CURRENT ROWã¯ãçŸåšã®ã«ãŒãœã«äœçœ®ã瀺ããŸãã ããšãã°ããçŸåšã®è¡ãšæªãã€ã³ãã®ãã©ããŒã®é ãã¯ãçŸåšã®è¡ããç¯å²ã®çµãããŸã§ãæå³ããŸãã - ãªãŒããŒïŒç¯å²ïŒ
ããã§CURRENT ROWã¯ããŠã£ã³ããŠã®å é ãšããŠORDER BYããã®ç¯å²ã®å§ãŸããæå³ãããŠã£ã³ããŠã®çµãããšããŠORDER BYã®ç¯å²ã®æåŸã®è¡ãæå³ãããšããç¹ã§ROWSãšç°ãªããŸãã
ç°ãªãã·ã¹ãã ã§ãŠã£ã³ããŠé¢æ°ã䜿çšããããã®æ§æã¯ãããã«ç°ãªããŸãã
äžèšãèŠçŽãããšãSQLã®ããŸããŸãªã¬ããŒãã®æ§ç¯ãåæããéçºè ãæãäžè¬çãªã±ãŒã¹ã匷調ããæ§æã§å³å¯ã«å ·äœåãããšããå°ãèŠçãªæ°æã¡ãæ®ã£ãŠããŸãã
ã¬ã³ãŒããè¿ãé¢æ°
éèš/ãŠã£ã³ããŠé¢æ°ã®åºåã§ã¯ãçµæã®åè¡ã¯ãçä¿¡ããŒã¿ã¹ããªãŒã ã®ç¹å®ã®ç¯å²ã®è¡ã«å¯Ÿå¿ããŸãã 人çã§ã¯ããã®ãããªéä¿¡ã¯åžžã«ååšãããšã¯éããŸããã
ããšãã°ãå ±åæ£è¡å10X10ãäœæããå¿ èŠããããŸãïŒ ãã®ããã«ã¯ã672X672ãå¿ èŠã«ãªããŸãïŒã ãã㯠1ã€ã®ãã¹ã§å®è¡ã§ããŸãããã®ããã10åã®æ°å€ãã©ã¡ãŒã¿ãŒã䜿çšããŠäœæããéèšé¢æ°ãå®è¡ããŸãã 圌女ã®äœæ¥ã®çµæã¯ã10åã®å€ãããªã10è¡ã®ã¬ã³ãŒãã»ããã§ããåãããªãã¯ã¹èŠçŽ ã¯ãå ¥åã¹ããªãŒã ã®ãã¹ãŠã®è¡ãåç §ããŸãïŒããã€ãããã«é¢ä¿ãªãïŒã
ããšãã°ãPostgreSQlã§ã¯ãé¢æ°ãã2次å é åãè¿ãããšãã§ããŸãïŒäŸïŒ 'ARRAY [[1,2]ã[3,4]'ïŒã ãŸãã¯ããããªãã¯ã¹ãè¡ã«ã·ãªã¢ã«åããŸãã
è¯ãããšã§ããããã®ã¢ãããŒãã§åãå ¥ãããããã¬ãŒã ã¯ãŒã¯ã§çµæã®ãµã€ãºãç¶æããããšã¯åžžã«å¯èœãšã¯éããŸããã
åæ
çãªäœè«
ããšãã°ãç§ãã¡ã®ã¿ã¹ã¯ã¯ãžãªã¡ããªãäžè¬åããããšã§ãã
ãžãªã¡ããªã®ãµã€ãºã¯äžæã§ãããæ°åäžãã€ã³ãã®ãŠãŒã©ã·ã¢ã®æµ·å²žç·ã§ããå¯èœæ§ããããŸãã ãŸãã¯ãã®éã«ãéåžžã«ç²ããžãªã¡ããªããããããã¹ãã©ã€ã³ã§æ»ããã«ããå¿ èŠããããŸãã ãã©ã¡ãŒã¿ãéçŽã«æž¡ãããã¯ãã«ãŸãã¯æååã§ã¯ãªãããŒã¿ã¹ããªãŒã ãååŸããããšæããŸãã
ãã¡ãããããªãã¯åé¡ãã¯ããã«ãã§ãããããŠãããšèšãããšãã§ããŸãã誰ããããããªããDBMSã®ãžãªã¡ããªã¯ç¹å¥ãªæ¹æ³ã§ä¿åããããžãªã¡ããªãåŠçããããã®ç¹å¥ãªããã°ã©ã ããããŸã...
å®éã1ã€ã®ãã€ã³ãã移åããããšã§blobå šäœãæžãæããå¿ èŠããªããšããçç±ã ãã§ããžãªã¡ããªãéåžžã®ããŒãã«ã«ãã€ã³ãåäœã§ä¿åãããšéåžžã«äŸ¿å©ã§ãã DBMSã®ããããå Žæã§ç©ºéããŒã¿ããªãŒã¯ãããåã¯ãããšãã°ArcSDEã«ãããŸãã ã
ãžãªã¡ããªBLOBã®å¹³åãµã€ãºãããŒãžãµã€ãºãè¶ ãããšããã«ããã€ã³ããçŽæ¥æäœããæ¹ãããæçã«ãªããŸãã ãã€ã³ããããŒã§æäœããç©ççãªæ©äŒããã£ãå Žåãããããå±¥æŽãã€ãŒã«ãåã³å転ããŸãã
ãžãªã¡ããªã®ãµã€ãºã¯äžæã§ãããæ°åäžãã€ã³ãã®ãŠãŒã©ã·ã¢ã®æµ·å²žç·ã§ããå¯èœæ§ããããŸãã ãŸãã¯ãã®éã«ãéåžžã«ç²ããžãªã¡ããªããããããã¹ãã©ã€ã³ã§æ»ããã«ããå¿ èŠããããŸãã ãã©ã¡ãŒã¿ãéçŽã«æž¡ãããã¯ãã«ãŸãã¯æååã§ã¯ãªãããŒã¿ã¹ããªãŒã ãååŸããããšæããŸãã
ãã¡ãããããªãã¯åé¡ãã¯ããã«ãã§ãããããŠãããšèšãããšãã§ããŸãã誰ããããããªããDBMSã®ãžãªã¡ããªã¯ç¹å¥ãªæ¹æ³ã§ä¿åããããžãªã¡ããªãåŠçããããã®ç¹å¥ãªããã°ã©ã ããããŸã...
å®éã1ã€ã®ãã€ã³ãã移åããããšã§blobå šäœãæžãæããå¿ èŠããªããšããçç±ã ãã§ããžãªã¡ããªãéåžžã®ããŒãã«ã«ãã€ã³ãåäœã§ä¿åãããšéåžžã«äŸ¿å©ã§ãã DBMSã®ããããå Žæã§ç©ºéããŒã¿ããªãŒã¯ãããåã¯ãããšãã°ArcSDEã«ãããŸãã ã
ãžãªã¡ããªBLOBã®å¹³åãµã€ãºãããŒãžãµã€ãºãè¶ ãããšããã«ããã€ã³ããçŽæ¥æäœããæ¹ãããæçã«ãªããŸãã ãã€ã³ããããŒã§æäœããç©ççãªæ©äŒããã£ãå Žåãããããå±¥æŽãã€ãŒã«ãåã³å転ããŸãã
æåŸã«çµæå šäœãåæã«ååŸããããããå ±åæ£è¡åã¯ãŸã å ¥åã¹ããªãŒã ãšåºåã¹ããªãŒã éã®éåæåã®éåžžã«è¯ãäŸã§ã¯ãããŸããã ãœãŒã¹ããŒã¿ã¹ããªãŒã ãåŠç/å§çž®ããããšããŸãã åæã«
- 倧éã®ããŒã¿ãããããããã¯ã€ã³ããã¯ã¹ãªãã®ãããŒããã«ãããŸããå®éããããã¯åã«ãè¿ éã«ããã£ã¹ã¯ã«æžã蟌ãŸããŸããã
- æ¯èŒçå°æ°ã®ç°ãªãã«ããŽãªã«åé¡ããå¿ èŠããããŸã
- ã«ããŽãªå ã§ãæéééã®å¹³åãå¹³åã®ã¿ã枬å®æ°ãšåæ£ã®ã¿ãä¿å
- ããããã¹ãŠãè¿ éã«è¡ãå¿ èŠããããŸã
ãªãã·ã§ã³ã¯äœã§ããïŒ
- SQLå ã§ã¯ãæééé/ã«ããŽãªã§ãœãŒãããå¿ èŠããããŸãããããã¯æåŸã®ãã€ã³ããšççŸããŸãã
- ããŒã¿ãæ¢ã«æéã§ãœãŒããããŠããïŒå®éã«ã¯ä¿èšŒãããŠããªãïŒããã®äºå®ãSQLããã»ããµã«äŒããããšãã§ããå Žåã¯ããŠã£ã³ããŠé¢æ°ãš1ã€ã®ãã¹ã§è¡ãããšãã§ããŸãã
- ããããã¹ãŠè¡ãå¥ã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã PL / SQLããŸãã¯ããå€ãã®å ŽåãC / C ++ã§å€ãã®ããŒã¿ãããããšãèãããšã
- ã¬ã³ãŒããè¿ãé¢æ°ã ãããã圌ãã¯ç§ãã¡ãå©ããããšãã§ããŸãã
A.4ãã®è©³çŽ° ããã«ã¯ãäžæããŒãã«ãšãã€ãã©ã€ã³é¢æ°ã®2ã€ã®ã¡ã«ããºã ããããŸãã
- ã³ã³ãã¢æ©èœã
ãã®ã¡ã«ããºã ã¯OracleïŒ2001幎9i以éïŒã«ç»å Žããã¬ã³ãŒãã»ãããè¿ãé¢æ°ãããŒã¿ãèç©ãããå¿ èŠã«å¿ããŠèšç®ã§ããããã«ããŸãïŒãã€ãçµç±ã§æ¥ç¶ããã2ã€ã®ããã»ã¹ã®stdoutãšstdinã®åæã«äŒŒãŠããŸãïŒã
ã€ãŸã ãã€ãã©ã€ã³é¢æ°ã®çµæã¯ããã®é¢æ°ãçµäºããåã«åŠçãéå§ããå ŽåããããŸãã ãã®ããã«ã¯ãé¢æ°ã®å®çŸ©ã§èšãã ãã§ååã§ã
FUNCTION f_trans(p refcur_t) RETURN outrecset PIPELINED IS âŠ
æ¬äœã«çµæè¡ãç»é²ããŸã
LOOP ⊠out_rec.var_char1 := in_rec.email; out_rec.var_char2 := in_rec.phone_number; PIPE ROW(out_rec); ⊠END LOOP;
ãã®çµæã
SELECT * FROM TABLE( refcur_pkg.f_trans( CURSOR(SELECT * FROM employees WHERE department_id = 60)));
ãã€ãã©ã€ã³é¢æ°ãããå Žåãã«ã¹ã¿ã éèšã¯å¿ èŠãããŸããã
ãªã©ã¯ã«ããã©ããŒïŒ
å°ãåïŒ2014ïŒããã€ãã©ã€ã³é¢æ°ã¯DB2ïŒIBM i 7.1 TR9ãi 7.2 TR1ïŒã«ãç»å ŽããŸããã - äžæããŒãã«ã
ããããã MS SQLã§ãPostgreSQLã§ããéçŽé¢æ°ããã«ãŒãœã«ãè¿ãããšã¯æããã«äžå¯èœã§ãã
ããŠããã€ãã©ã€ã³é¢æ°ãšåæ§ã«ãã«ãŒãœã«ããã©ã¡ãŒã¿ãŒãšããŠååŸããåŠçããäžæããŒãã«ã«è¿œå ããŠãã«ãŒãœã«ãæ»ããŸãããã
ãã ããMS SQLã§ã¯ããã©ã¡ãŒã¿ã«ãã£ãŠã¹ãã¢ãããã·ãŒãžã£ã«ã«ãŒãœã«ãæž¡ãããšã¯ã§ããŸãã ;ããã·ãŒãžã£ã§ã«ãŒãœã«ãäœæããåºåãéããŠãã©ã¡ãŒã¿ãè¿ãããšã®ã¿ãå¯èœã§ãã PostgreSQL ã«ã€ããŠãåãããšãèšããŸãã
ããŠã倧äžå€«ãã«ãŒãœã«ãéããŠæžç®ããå€ãåŠçããçµæãèšç®ããäžæããŒãã«ã«è¿œå ããŠãã«ãŒãœã«ãã¬ã³ããªã³ã°ããŸãã
ãŸãã¯ãããã«ç°¡åã«ãã¯ãšãªçµæã1ã€ã®äžæããŒãã«ã«è¿œå ããŠåŠçããã«ãŒãœã«ãä»ããŠå¥ã®äžæããŒãã«ã«çµæãè¿ããŸãã
äœãšèšã£ãŠãããã ãŸãããããŠæãéèŠãªããšã¯ãã«ãŒãœã«ãä»ããããŒã¿ã®èªã¿åãã¯ãã¹ããªãŒã ã§ã®åŠçãããé ãããšã§ãã 次ã«ããªãSQLããã»ããµãå¿ èŠãªã®ããã«ãŒãœã«ã䜿çšããŠããŒãã«ãèªã¿åããæã§äžæããŒãã«ãäœæããã«ãŒãå ã«çµåããžãã¯ãäœæããŸããã... C / C ++ã§ã®ã¢ã»ã³ãã©æ¿å ¥ã®ããã§ãã
ãããã£ãŠãã¬ã³ãŒãã»ãããè¿ãé¢æ°ã«é¢ãã質åãæ€èšããçµæãçµè«ã«éããŸããã
- ããã§ã¯ãã«ã¹ã¿ã éèšã¯ããŸã圹ã«ç«ã¡ãŸããã
- ãããã«ãããããŒã¿ããŒã¹ã«ããã€ãã®ãªããžã§ã¯ããäœæããå¿
èŠããããŸãã é¢æ°ã§ããäžæããŒãã«ã§ããã å°ãªããšããé©åãªæš©å©ãå¿
èŠã§ãã ãããŠãããã€ãã®æ°åãåŠçãããã ãã§ãã
- ããã«ããããããã説æãããŠããå¶éããã£ãŠããããŸããšã¬ã¬ã³ãã§ã¯ãªãå ŽåããããŸããããã®æ¹æ³ã䜿çšããŠåé¡ã解決ã§ããŸãã
ä»ã«äœ
å®éãåé¡ã解決ããæ©äŒããã§ã«ããå Žåãèè ã«ã¯ä»ã«äœãå¿ èŠã§ããïŒ
å®éããã¥ãŒãªã³ã°ãã·ã³ã¯äœã§ãèšç®ã§ããŸãããããã¯éåžžã«éããªããããŸã䟿å©ã§ã¯ãããŸããã
次ã®ããã«èŠä»¶ãçå®ããŸãã
- æ®ãïŒéžæãæ圱ãªã©ïŒãšåçã«äœ¿çšã§ããé¢ä¿æŒç®åã§ããå¿ èŠããããŸãã
- ããããŒã¿ã¹ããªãŒã ãå¥ã®ããŒã¿ã¹ããªãŒã ã«å€æããæŒç®åã§ãªããã°ãªããŸãã
- å ¥åã¹ããªãŒã ãšåºåã¹ããªãŒã ã®éã«åæã¯ãããŸãã
- æŒç®å宣èšã¯ãåºåã¹ããªãŒã ã®æ§é ãå®çŸ©ããŸã
- æŒç®åã¯ãåçã«åæåããæ©èœãæã£ãŠããŸãïŒé¢æ°ã®åœ¢åŒã§ãããæ£ç¢ºã«ã¯ãã®æ¬äœã§ãæŒç®åã®å®çŸ©ã§çŽæ¥æå®ãããŸãïŒ
- é¢æ°ã®åœ¢åŒã®ãã¹ãã©ã¯ã¿ïŒ...ïŒ
- å ¥åã¹ããªãŒã ããæ°ããè¡ãååŸããããã³ã«åŒã³åºãããé¢æ°ïŒ...ïŒ
- ãªãã¬ãŒã¿ãŒã«ã¯å®è¡ã³ã³ããã¹ãããããŸã-äœæ¥ã«å¿ èŠãªãŠãŒã¶ãŒå®çŸ©ã®å€æ°ããã³/ãŸãã¯ã³ã¬ã¯ã·ã§ã³ã®ã»ãã
- ãã®æŒç®åãå®è¡ããã«ã¯ãããŒã¿ããŒã¹ãªããžã§ã¯ããäœæããå¿ èŠã¯ãããŸãããè¿œå ã®æš©éã¯å¿ èŠãããŸãã
- ä»äºã«å¿ èŠãªãã®ã¯ãã¹ãŠã1ã€ã®å Žæã1ã€ã®èšèªã§å®çŸ©ãããŸãã
ãããããããèè ã¯ãå®è£ ãããTTM /ãã¥ãŒããªã¢ã«Dã®ãµãã»ããã®èªäœããã»ããµãæ¡åŒµããæŒç®åãäœæããŸããã çŸåšãSQLã«ã€ããŠãåãèãæ¹ãææ¡ãããŠããŸãã
èŠåãã䟡å€ããããŸããããã§SQLãçµäºããå³èãå§ãŸããŸãã æ§æã¯å ã®ãã®ã®ãŸãŸã§ãããæçµçã«ã¯ä»»æã®æ§æç³ãååšããå¯èœæ§ããããŸãããããã¯æ¬è³ªãå€æŽããŸããã
ãããã£ãŠã åãæŒç®åã¯
- åºåãã£ãŒã«ããšãã®ã¿ã€ãã®ãªã¹ããå«ãããããŒã
ååºåïŒããã³å ¥åïŒãã£ãŒã«ãã¯ããŒã«ã«å€æ°ã§ãã
äŸïŒ â chew {â var1â floatãâ var2â integer}âã¯ãåºåã¹ããªãŒã ã«æµ®åå°æ°ç¹ãšæŽæ°ã®2ã€ã®åãããããšãæå³ããŸã - ããã£-çŸæç¹ã§ã®ã€ãã³ãã®ã³ãŒã«ããã¯ã®ãªã¹ã-ã¹ããªãŒã ã®éå§ãã¹ããªãŒã ã®çµäºãã©ã€ã³ã æ§æäžãé¢æ°ã¯PL / SQLã«è¿ãã§ãã äºåå®çŸ©é¢æ°__interrupt ïŒïŒã¯PIPEã«é¡äŒŒããŠãããåºååã«å¯Ÿå¿ããå€æ°ããå€ãååŸããåºåã¹ããªãŒã ã«é
眮ããŸãã åºåã¹ããªãŒã ã®ãããã¡ããªãŒããŒãããŒãããšããã³ãã©ãŒã®äœæ¥ãäžæåæ¢ããã¹ããªãŒã ã®åä¿¡åŽã®äœæ¥ãéå§ãããŸãã
äŸïŒãããã¯ãinitã{var1ïŒ= 0; var2ïŒ= -1; } "
äŸã衚瀺ããæãç°¡åãªæ¹æ³ã
- éèšé¢æ°SUMã®é¡äŒŒç©ã
-- 'select sum(val) from samples' -- select * from samples chew {âsum(val)â float} -- hook âinitâ { âsum(val)â := 0; -- } hook ârowâ { if (not isnull("val")) then "sum(val)" := "sum(val)" + "val"; end if; } hook âfinitâ { call __interrupt(); -- PIPE }
ããã°ã£ãŠããŸãããããã¯åãªãäŸã§ãã
ããã€ãã®æ°åãè¿œå ããããã«Cããã°ã©ã ãäœæããå¿ èŠã¯ãããŸããã - SUM + AVG
-- 'select sum(val), avg(val) from samples' -- select * from samples chew { âsum(val)â float, âavg(val)â float -- } hook âinitâ { âsum(val)â := 0; âavg(val)â := 0; var num integer; num := 0; -- , } hook ârowâ { if (not isnull("val")) then "sum(val)" := "sum(val)" + "val"; num := num + 1; end if; } hook âfinitâ { if (num > 0) then âavg(val)â := âsum(val)â / num; end if; call __interrupt(); }
ããã§ã¯ãåèšã1åããçºçããªããšããäºå®ã«æ³šç®ããŸãã - SUM + GROUP BY
-- 'select sum(val) from samples group by type' -- select * from -- ( samples val, type from samples order by type ) chew { âsum(val)â float } hook âinitâ { âsum(val)â := 0; var gtype integer; gtype := NULL; var num integer; -- num := 0; } hook ârowâ { if (gtype <> âtypeâ) then __interrupt(); âgtypeâ := type; "sum(val)" := 0; num := 0; end if; if (not isnull("val")) then "sum(val)" := "sum(val)" + "val"; num := num + 1; end if; } hook âfinitâ { if (num > 0) then call __interrupt(); end if; }
- ROW_NUMBERïŒïŒOVERïŒïŒ
-- select row_number() over() as num, * from samples -- select * from samples chew { ânumâ integer, * -- -- '* except val1, ...valX', TTM } hook âinitâ { num := 0; } hook ârowâ { num := num + 1; call __interrupt(); }
ãã®ã¢ãããŒããéåžžã®æ¹æ³ã§æ ¹æ¬çã«éæã§ããªãçµæãããããäŸãæäŸããããšã¯å¯èœã§ããïŒ ãããããããŸãã
ããŒã¿ãã»ãšãã©ãœãŒããããŠããå ŽåããããŸãã å®å šã«äžŠã¹æ¿ããããŠããå ŽåããããŸããã確å®ã«ã¯ããããŸããã
äžèšã®äŸïŒããŒã¿ã¹ããªãŒã å§çž®ïŒã§ãããŒã¿ã¯ããŸããŸãªãœãŒã¹ããã®ãã®ã§ãããããŸããŸãªçç±ã§ãããã«æ··åšããå¯èœæ§ããããšããŸãã ã€ãŸãã¿ã€ã ã¹ã¿ã³ãT1ãæã€1ã€ã®ãœãŒã¹ããã®è¡ã¯ãæéT2ãæã€å¥ã®ãœãŒã¹ããã®è¡ã®åŸã«ããŒã¿ããŒã¹ã«ååšã§ããŸãããT1 <T2ã§ãã
T1ãšT2ã®å·®ãç¹å®ã®ïŒããããªïŒå®æ°ã決ããŠè¶ ããªãããšãä¿èšŒãããšããŠããããã§ïŒåŸæ¥ã®æ¹æ³ã§ïŒãœãŒãããã«ã¯ã§ããŸããã
ãã ããææ¡ãããã¢ãããŒãã䜿çšãããšãå ¥åã¹ããªãŒã ããããã¡ãªã³ã°ãããçŸåšã®æéééã®ããŒã¿ãåŠçãããã®ã¯ãå ¥åãééã®å³å¢çãŸã§ã«å°ãªããšãäžå®ã®å®æ°ãè¶ ããã¿ã€ã ã¹ã¿ã³ããæã€è¡ãåä¿¡ããåŸã®ã¿ã§ãã
ããã«ã¯éåžžã«éèŠãªãã€ã³ãããããŸãã
ããŒã¿ãã»ãšãã©ãœãŒããããŠããããšãç¥ã£ãŠããã®ã¯ç§ãã¡ã ãã§ãã
ç§ãã¡ã ãããã®å®æ°ã®å€ãç¥ã£ãŠããŸãã
ãã®å®æ°ã¯ããã®åé¡ã«ã®ã¿ç¹åŸŽçã§ããããããããã®å®éšã«ã®ã¿ç¹åŸŽçã§ãã
ãããŠããã®ããã¯ãèªåã®è²¬ä»»ã§äœ¿çšããŠããœãŒããåé¿ããŸãã
ã¿ã¹ã¯ã«é¢ããæšæºçãªç¥èã¯ãSQLããã»ããµã«äŒããããã®æšæºçãªæ¹æ³ã§ã¯ååšãããæ³åããããšã¯å°é£ã§ãã
ãŸããã©ã ãé¢æ°ã䜿çšãããšãSQLããã»ããµã«ãå¿ èŠãªå Žæã§å¿ èŠãªããšãæ£ç¢ºã«å®è¡ãããæ®éçãªæ¹æ³ãæäŸãããŸãã
ãããã«
ææ¡ãããèšèšã¯ãå®è£ ããã®ãããã»ã©é£ãããªãããã§ãã
ãããã®å Žåã§ããæå¹ãªPL / SQLã䜿çšããŸãã
ã¢ã€ãã¢èªäœã¯ã·ã³ãã«ã§çŽæçã§ãæ°ãããšã³ãã£ãã£ãèšèªã«è¿œå ããŸããã
ããã¯åäžã®ãŠãããã§ãããå¿ èŠã«å¿ããŠãéçŽé¢æ°ãšãŠã£ã³ããŠé¢æ°GROUP BYã眮ãæããŸãã
åŸæ¥ã®SQLããã»ããµã§ã¯æ¹æ³ããªãå Žåã«ããœãŒããªãã§å®è¡ã§ããã¡ã«ããºã ã
ããããæãéèŠãªã®ã¯ãããŒã¿ã䜿çšããŠæãå¿ èŠãªæ¹æ³ã§ã奜ããªããšãèªç±ã«è¡ããã¡ã«ããºã ã§ãã
PSïŒèšäºã®æºåã«åå ããŠãããDorofei Proleskovskyã«æè¬ããŸãã