Zana za kuunda maswali ya uchanganuzi na yanayojirudia

WITH hutoa njia ya kuandika taarifa za ziada za matumizi katika maombi makubwa. Taarifa hizi, pia huitwa Maneno ya Jedwali la Kawaida (CTE), zinaweza kuzingatiwa kama fasili za muda za jedwali ambazo zipo kwa hoja moja pekee. Taarifa ya ziada katika kifungu cha WITH inaweza kuwa CHAGUA, INGIZA, SASISHA, au FUTA, na kifungu chenyewe cha WITH kimeambatishwa kwenye taarifa kuu, ambacho kinaweza pia kuwa CHAGUA, INGIZA, SASISHA, au FATA.

7.8.1. CHAGUA katika NA

Kusudi kuu la SELECT katika kifungu cha WITH ni kugawa maswali changamano katika sehemu rahisi zaidi. Kwa mfano, ombi:

NA mauzo ya kikanda AS (CHAGUA eneo, SUM(kiasi) AS jumla_mauzo KUTOKA kwa maagizo GROUP KWA eneo), maeneo_ya juu AS (CHAGUA eneo KUTOKA kwa mauzo_ya_mauzo WHERE jumla_mauzo > (CHAGUA SUM(jumla_mauzo)/10 KUTOKA kwa mauzo_ya_mauzo)) CHAGUA eneo, bidhaa, SUM(wingi ) AS product_units, SUM(kiasi) AS product_sales KUTOKA kwa maagizo AMBAPO eneo KATIKA (CHAGUA eneo KUTOKA mikoa_ya juu) KUNDI KWA eneo, bidhaa;

huonyesha matokeo ya mauzo kwa mikoa inayoongoza pekee. Kifungu cha WITH kinafafanua mbili mwendeshaji wa ziada mauzo_ya_mauzo na mikoa_ya_juu ili matokeo ya mauzo_ya_mauzo yatumike katika mikoa_ya_juu na matokeo ya mikoa_ya_ya_juu yanatumika katika CHAGUA swali. Mfano huu unaweza kuandikwa upya bila WITH , lakini basi tutahitaji viwango viwili vya hoja ndogo za SELECT zilizowekwa. Hii inaweza kufanyika kwa urahisi kidogo kwa kutumia njia iliyoonyeshwa hapo juu.

Kifungu cha hiari cha RECURSIVE hugeuka WITH kutoka kwa muundo rahisi wa kisintaksia hadi njia ya kufanya jambo ambalo haliwezekani katika SQL ya kawaida. Kwa kutumia RECURSIVE, swali la WITH linaweza kufikia matokeo yake yenyewe. Mfano rahisi sana wa muhtasari wa nambari kutoka 1 hadi 100:

NA t(n) RUDIWA KAMA (MAADILI (1) MUUNGANO WOTE CHAGUA n+1 KUTOKA WAPI n< 100) SELECT sum(n) FROM t;

KATIKA mtazamo wa jumla Hoja ya kujirudia KWA WITH kila mara huandikwa kama si sehemu ya kujirudia, kisha MUUNGANO (au MUUNGANO WOTE), na kisha sehemu ya kujirudia, ambapo tu katika sehemu ya kujirudia unaweza kufikia matokeo ya hoja. Ombi kama hilo linatekelezwa kama ifuatavyo:

Kutathmini Hoja ya Kujirudia

    Sehemu isiyo ya kujirudia imehesabiwa. Kwa UNION (lakini si UNION ALL), safu mlalo rudufu hutupwa. Safu zote zilizobaki zimejumuishwa katika matokeo ya swali la kujirudia na pia huwekwa kwa muda karatasi ya kazi.

    Kwa muda mrefu kama jedwali la kazi sio tupu, hatua zifuatazo zinarudiwa:

    1. Sehemu ya kujirudia inatathminiwa ili rejeleo la kujirudia kwa swali lenyewe lifikie maudhui ya sasa ya jedwali la kazi. Kwa UNION (lakini si UNION ALL), nakala za safu mlalo na safu mlalo ambazo zina nakala za zilizopokelewa awali hutupwa. Safu zote zilizobaki zimejumuishwa katika matokeo ya swali la kujirudia na pia huwekwa kwa muda meza ya kati.

      Yaliyomo kwenye jedwali la kazi hubadilishwa na yaliyomo kwenye meza ya staging, na kisha meza ya staging inafutwa.

Katika mfano ulioonyeshwa hapo juu, jedwali la kazi katika kila hatua lina safu moja tu na maadili kutoka 1 hadi 100 yanakusanywa ndani yake. Katika hatua ya mia, shukrani kwa WAPI hali, hakuna kitu kinachorejeshwa, kwa hivyo tathmini ya hoja inaisha.

Hoji za kujirudia kwa kawaida hutumiwa kufanya kazi na miundo ya data ya viwango vya juu au ya miti. Kama mfano muhimu unaweza kuunda swali ambalo hupata sehemu zote za moja kwa moja na zisizo za moja kwa moja za bidhaa, kwa kutumia meza tu iliyo na viunganisho vya moja kwa moja:

PAMOJA NA_sehemu_zinazojumuisha(sehemu_ndogo, sehemu, kiasi) AS (CHAGUA sehemu_ndogo, sehemu, kiasi KUTOKA sehemu WHERE sehemu = "bidhaa_yetu" MUUNGANO WOTE CHAGUA p.sub_part, p.part, p.quantity KUTOKA pamoja_sehemu pr, sehemu p. = pr.sub_part) CHAGUA_sehemu_ndogo, SUM(idadi) kama jumla_wingi FROM pamoja_sehemu GROUP BY sehemu_ndogo

Wakati wa kufanya kazi na maswali ya kujirudia, ni muhimu kuhakikisha kuwa sehemu ya kurudia ya swala haimalizi kurudisha nakala (safu), vinginevyo kitanzi kitakuwa kisicho na mwisho. Wakati mwingine inatosha kutumia UNION badala ya UNION ALL kwa hili, kwani hii itatupa safu ambazo tayari ziko kwenye matokeo. Walakini, mara nyingi kitanzi hutoa safu ambazo hazilingani kabisa na zile zilizopita: katika hali kama hizi, inaweza kuwa na maana kuangalia sehemu moja au zaidi ili kuamua ikiwa hatua ya sasa imefikiwa mapema. Mbinu ya kawaida Suluhisho la shida kama hizi ni kuhesabu safu iliyo na maadili yaliyochakatwa tayari. Kwa mfano, fikiria swali lifuatalo, ambalo hutazama jedwali la grafu kwa sehemu ya kiungo:

KWA RECURSIVE search_graph(id, kiungo, data, kina) AS (CHAGUA g.id, g.link, g.data, 1 KUTOKA grafu g UNION WOTE CHAGUA g.id, g.link, g.data, sg.depth + 1 KUTOKA kwenye grafu g, search_graph sg WAPI g.id = sg.link) CHAGUA * KUTOKA search_graph;

Ombi hili litatokea ikiwa viungo vya kiungo vina vitanzi. Kwa kuwa tunahitaji kupata kama matokeo " kina", kubadilisha tu UNION ALL kuwa MUUNGANO hakutaepuka kitanzi. Badala yake, ni lazima kwa namna fulani kuamua kile ambacho tayari tumefanikiwa mstari wa sasa, baada ya kutembea kwa njia fulani. Ili kufanya hivyo, tunaongeza njia ya safu wima mbili na mzunguko na kupata swali linalolindwa na mzunguko:

KWA RECURSIVE search_graph(kitambulisho, kiungo, data, kina, njia, mzunguko) AS (CHAGUA g.id, g.link, g.data, 1, ARRAY, uongo KUTOKA kwenye grafu g UNION ALL CHAGUA g.id, g.link, g.data, sg.depth + 1, njia || g.id, g.id = YOYOTE(njia) KUTOKA kwenye grafu g, search_graph sg WAPI g.id = sg.link NA SIO mzunguko) CHAGUA *KUTOKA_KUTOKA_tafuta_grafu;

Kando na kuzuia vitanzi, maadili ya safu mara nyingi ni muhimu kwao wenyewe kuwakilisha " njia " inayoongoza kwa mstari maalum.

Kwa ujumla, unapohitaji kuangalia sehemu nyingi ili kugundua mzunguko, unapaswa kutumia safu ya masharti. Kwa mfano, ikiwa unahitaji kulinganisha sehemu f1 na f2:

KWA RECURSIVE search_graph(kitambulisho, kiungo, data, kina, njia, mzunguko) AS (CHAGUA g.id, g.link, g.data, 1, ARRAY, uongo KUTOKA kwenye grafu g UNION ALL CHAGUA g.id, g.link, g.data, sg.depth + 1, njia || ROW(g.f1, g.f2), ROW(g.f1, g.f2) = YOYOTE(njia) KUTOKA kwenye grafu g, search_graph sg WAPI g.id = sg.link NA SIO mzunguko) CHAGUA * KUTOKA kwa search_graph;

Dokezo

Mara nyingi sehemu moja inatosha kutambua mzunguko, na kisha ROW() inaweza kuachwa. Hii haitatumia safu ya data aina ya mchanganyiko, lakini safu rahisi, ambayo ni ya ufanisi zaidi.

Dokezo

Kanuni hii ya tathmini ya hoja inayojirudia hutoa nodi zilizopangwa kando ya njia ya kuzamisha. Ili kupata matokeo kupangwa kwa kina, unaweza kuongeza ORDER BY safuwima kwenye hoja ya nje. njia", iliyopatikana kama inavyoonyeshwa hapo juu.

Ujanja mzuri wa maswali ya kujaribu ambayo yanaweza kutokea ni kuongeza LIMIT kwa hoja kuu. Kwa mfano, hoja ifuatayo itazunguka ikiwa hutaongeza kifungu LIMIT:

NA t(n) INAYOREJEA AS (CHAGUA MUUNGANO 1 WOTE CHAGUA n+1 KUTOKA t) CHAGUA n KUTOKA t LIMIT 100;

Lakini katika kwa kesi hii hii haifanyiki, kwa sababu ndani PostgreSQL Hoja ya A WITH hutoa safu mlalo nyingi kadri hoja ya mzazi inavyokubali. Mbinu hii haipendekezi katika mazingira ya uzalishaji, kwani mifumo mingine inaweza kuwa na tabia tofauti. Zaidi ya hayo, hii haitafanya kazi ikiwa hoja ya nje inapanga matokeo ya swali linalojirudia au kuyaunganisha na jedwali lingine, kwani katika hali kama hizi swala la nje kwa kawaida litachagua tokeo lote la swali la WITH hata hivyo.

NA maswali mali muhimu- zinatathminiwa mara moja tu kwa hoja nzima ya mzazi, hata kama swali hilo au maswali jirani ya WITH yanazifikia mara nyingi. Kwa njia hii, mahesabu changamano ambayo matokeo yake yanahitajika katika maeneo mengi yanaweza kuwekwa kwenye HOJA NA WITH kwa madhumuni ya uboreshaji. Kwa kuongeza, maswali kama haya huepuka tathmini za utendakazi zisizohitajika na madhara. Hata hivyo, kuna pia upande wa nyuma- Kiboreshaji hakiwezi kueneza vikwazo vya hoja ya mzazi katika swali la WITH jinsi kinavyoweza kwa hoja ndogo ya kawaida. Hoja ya A WITH kwa kawaida hutekelezwa kihalisi na hurejesha safu mlalo zote, ikijumuisha zile ambazo swali kuu linaweza kutupilia mbali. (Lakini kama ilivyotajwa hapo juu, hesabu inaweza kuacha mapema ikiwa rejeleo la swali hili linahitaji tu idadi ndogo mistari.)

Mifano iliyo hapo juu inaonyesha tu kifungu cha WITH chenye SELECT , lakini kinaweza kutumika pamoja na amri za INSERT , UPDATE , na DELETE kwa njia ile ile. Katika kila kisa, kimsingi huunda jedwali la muda ambalo linaweza kupatikana katika amri kuu.

7.8.2. Kubadilisha Data katika WITH

Unaweza pia kutumia taarifa za kurekebisha data (INGIZA, SASISHA, au FUTA) katika kifungu cha WITH. Hii hukuruhusu kufanya shughuli kadhaa tofauti mara moja katika ombi moja. Kwa mfano:

NA safu_lalo zilizohamishwa AS (FUTA KUTOKA KWA bidhaa WAPI "tarehe" >= "2010-10-01" NA "tarehe"< "2010-11-01" RETURNING *) INSERT INTO products_log SELECT * FROM moved_rows;

Hoja hii kwa hakika huhamisha safu kutoka kwa bidhaa hadi products_log . FUTA taarifa katika WITH, huondoa safu mlalo zilizobainishwa kutoka kwa bidhaa na kurudisha yaliyomo katika kifungu cha KURUDISHA; na kisha swali kuu husoma maudhui haya na kuiingiza kwenye jedwali la products_log.

Kumbuka kuwa kifungu cha WITH katika kesi hii kimeambatishwa kwa taarifa ya INGIZA, si kwa CHAGUA kilichowekwa ndani ya INSERT. Hii ni muhimu kwa sababu WITH inaweza tu kuwa na taarifa zinazobadilisha data kwa ngazi ya juu ombi. Hata hivyo, wanaomba kanuni za kawaida KWA mwonekano, ili matokeo ya WITH pia yaweze kufikiwa kutoka kwa taarifa ya CHAGUA iliyoorodheshwa.

Taarifa za kurekebisha data katika WITH kwa kawaida huambatanishwa na kifungu cha KURUDISHA (angalia Sehemu ya 6.4), kama inavyoonyeshwa katika mfano huu. Ni muhimu kuelewa kwamba jedwali la muda ambalo linaweza kutumika katika swala lingine limeundwa kutokana na matokeo ya RETURNING , na Sivyo Jedwali la lengo la waendeshaji. Ikiwa taarifa ya urekebishaji data katika WITH haiambatani na kifungu cha KUREJESHA, jedwali la muda halijaundwa na haliwezi kufikiwa katika hoja iliyosalia. Walakini, ombi kama hilo bado litatekelezwa. Kwa mfano, wacha tuseme swali lifuatalo sio la vitendo sana:

NA t AS (FUTA KUTOKA foo) FUTA KWENYE mwambaa;

Itafuta safu mlalo zote kutoka kwa jedwali foo na bar . Katika hali hii, idadi ya safu mlalo zinazohusika ambazo mteja atapokea zitahesabiwa kulingana na safu mlalo zilizoondolewa kwenye upau .

PAMOJA NA_sehemu_zinazojumuisha(sehemu_ndogo, sehemu) AS (CHAGUA_sehemu_ndogo, sehemu KUTOKA sehemu AMBAPO sehemu = "bidhaa_yetu" MUUNGANO ZOTE CHAGUA p.sehemu_ndogo, uk.sehemu KUTOKA PAMOJA_sehemu pr, sehemu p AMBAPO p.part = pr.sub_part) FUTA KUTOKA kwa sehemu WAPI sehemu NDANI (CHAGUA sehemu KUTOKA pamoja_sehemu);

Swali hili huondoa vipengele vyote vya moja kwa moja na vya moja kwa moja vya bidhaa.

Waendeshaji wanaorekebisha data katika WITH hutekelezwa mara moja tu na kila mara kwa ukamilifu, bila kujali kama hoja kuu inakubali matokeo yao. Kumbuka kuwa hii inatofautiana na tabia ya SELECT katika WITH: kama ilivyojadiliwa katika sehemu iliyotangulia, SELECT inatekelezwa mradi tu matokeo yake yamedaiwa na hoja kuu.

Taarifa zilizowekwa katika WITH hutekelezwa kwa wakati mmoja na swali kuu. Kwa hivyo, mpangilio ambao taarifa katika WITH zitabadilisha data haitabiriki. Taarifa hizi zote zinatekelezwa kwa moja picha ya data(tazama Sura ya 13) ili wasiweze " ona" jinsi kila mmoja wao hubadilisha meza zinazolengwa. Hii inapunguza kutotabirika kwa mpangilio halisi wa mabadiliko ya safu mlalo na inamaanisha kuwa KUREJESHA ndilo chaguo pekee la kupitisha mabadiliko kutoka kwa taarifa zilizowekwa na WITH hadi hoja kuu. Kwa mfano, katika kesi hii:

NA t AS (SASISHA bidhaa SET bei = bei * 1.05 KURUDISHA *) CHAGUA * KUTOKA KWA bidhaa;

taarifa ya nje SELECT itarejesha bei zilizokuwa kabla ya KUSASISHA, ilhali katika hoja

NA t AS (SASISHA bidhaa SET bei = bei * 1.05 KURUDISHA *) CHAGUA * KUTOKA t;

SELECT ya nje itarudisha data iliyobadilishwa.

Kubadilisha mfuatano uleule mara kadhaa ndani ya taarifa sawa hakutumiki. Moja tu ya mabadiliko kadhaa yatafanyika, na kuamua kwa uhakika ni ipi ambayo mara nyingi ni ngumu sana (na wakati mwingine hata haiwezekani). Hii inatumika pia wakati safu mlalo inafutwa na kurekebishwa katika taarifa sawa: matokeo yanaweza kuwa sasisho pekee. Kwa hiyo, kwa ujumla, shughuli hizo za kuingiliana zinapaswa kuepukwa. Hasa, epuka KWA maswali madogo, ambayo yanaweza kuathiri safu mlalo zilizorekebishwa na taarifa kuu au taarifa zilizowekwa ndani yake. Matokeo ya maombi kama haya hayatabiriki.

Kwa sasa, taarifa inayorekebisha data katika WITH haiwezi kulenga jedwali ambalo kwayo kanuni ya masharti au sheria ya PIA au BADALA ikiwa ina taarifa nyingi.

SQL ya kawaida:1999 na kufungua uwezekano wa kutumia lugha katika programu ambazo hazikufaa hapo awali. Ni kuhusu kuhusu uwezekano wa uchambuzi na maswali ya kujirudia . Mada hizi hazijaunganishwa kimantiki; zimeunganishwa tu na ukweli kwamba zana zinazolingana ni ngumu sana na sio rahisi kuelewa kila wakati. Katika hotuba hii fupi hatutafuti kutoa Maelezo kamili uwezo ulioainishwa katika kiwango cha SQL. Lengo letu ni tu muhtasari wa jumla elezea mbinu ya SQL katika mwelekeo huu.

Programu za uchanganuzi kwa kawaida hazihitaji data ya kina iliyohifadhiwa moja kwa moja kwenye hifadhidata, lakini baadhi ya jumla na mijumlisho yake. Kwa mfano, uchanganuzi hauvutii mshahara mtu maalum kwa wakati maalum, na mabadiliko mshahara jamii fulani ya watu kwa muda fulani. Kwa kutumia istilahi za SQL, swali la kawaida la hifadhidata kutoka kwa programu ya uchambuzi lina kifungu cha GROUP BY na simu. kazi za jumla. Ingawa katika kozi hii hatugusii maswala ya kutekeleza DBMS zinazoelekezwa kwa SQL, kutoka mambo ya jumla Inapaswa kuwa wazi kuwa maswali yaliyo na kifungu cha GROUP BY kwa ujumla ni "ngumu" kwa DBMS, kwani kupanga jedwali kwa ujumla kunahitaji aina ya nje.

Katika mifumo ya hifadhidata iliyoundwa mahsusi kwa matumizi ya uchanganuzi, shida kawaida hutatuliwa kwa uhifadhi usio wazi wa data iliyojumlishwa (yaani, matokeo ya simu kazi za jumla) Kwa kweli, hii inahitaji marekebisho ya nguvu ya maadili ya jumla yaliyohifadhiwa wakati data inabadilika, lakini kwa hifadhidata maalum kama hii sio mzigo mzito, kwani hifadhidata za uchanganuzi husasishwa mara chache sana.

Walakini, sio kila biashara inayoweza kumudu wakati huo huo hifadhidata ya kufanya kazi kwa kazi maombi ya kawaida usindikaji wa uendeshaji miamala (OLTP), kama vile uhasibu, HR na programu zingine, na hifadhidata ya uchanganuzi wa programu inayofanya kazi usindikaji wa uchambuzi (OLAP). Inabidi utekeleze programu za uchanganuzi kwenye hifadhidata za kina za uendeshaji, na programu hizi zinafikia DBMS na maswali mengi yanayotumia wakati kwa vifungu na simu za GROUP BY. kazi za jumla.

Wasanidi wa kiwango cha lugha ya SQL walijaribu kusuluhisha shida mbili kwa wakati mmoja: kupunguza idadi ya hoja zinazohitajika katika programu za uchanganuzi, na kupunguza gharama ya maswali ya GROUP BY ambayo hutoa data ya muhtasari unaohitajika. Katika somo hili tutajadili muhimu zaidi, kutoka kwa mtazamo wetu, ujenzi Lugha ya SQL, kuwezesha uundaji, utekelezaji na matumizi ya matokeo maswali ya uchambuzi: sehemu KUNDI KWA KUPANGA Na KUNDI KWA CUBE na mpya kazi ya jumla KUUNGANISHA, hukuruhusu kutafsiri kwa usahihi matokeo maswali ya uchambuzi mbele ya maadili yasiyobainishwa.

Kijadi, SQL haikuwahi kuwa na uwezo wa kuunda maswali ya kujirudia, wapi chini swali la kujirudia(kuiweka kwa urahisi) tunaelewa hoja kwenye jedwali ambayo yenyewe hubadilika kwa njia fulani wakati hoja hii inatekelezwa. Acha nikukumbushe kwamba hii imepachikwa katika semantiki za kimsingi Taarifa ya SQL: Kabla kifungu cha WAPI kutekelezwa, matokeo ya kifungu cha KUTOKA lazima yatathminiwe kikamilifu.

Hata hivyo, watengenezaji wa maombi mara nyingi wanapaswa kutatua matatizo ambayo njia za jadi za kuunda maswali katika lugha ya SQL haitoshi: kwa mfano, kutafuta njia kati ya pointi mbili za kijiografia, kuamua seti ya kawaida ya vipengele vya kukusanya kitengo fulani, nk. Kampuni zinazozalisha DBMS zenye mwelekeo wa SQL zilijaribu kutosheleza mahitaji hayo kupitia suluhu za umiliki zilizo na sifa ndogo za kujirudia, lakini hadi kuja kwa SQL:kiwango cha 1999, hakukuwa na zana za jumla sanifu.

Ikumbukwe kwamba kuna shinikizo fulani kati ya meza zinazozalishwa zinazoingia. Hata hivyo, tu kwa kurudia kwa mstari hutolewa vipengele vya ziada udhibiti wa utaratibu wa hesabu imefafanuliwa kwa kujirudia meza inayozalishwa na udhibiti wa kutokuwepo kwa mizunguko. Ikumbukwe kwamba wakati wa kusoma kiwango, wakati mwingine mtu hupata hisia kwamba waandishi wenyewe bado hawajatambua kikamilifu. matokeo iwezekanavyo, ambayo inaweza kutokana na matumizi ya miundo iliyoanzishwa. Nadhani katika matoleo yajayo ya kiwango tunapaswa kutarajia ufafanuzi na/au vikwazo vya matumizi ya miundo hii. Katika suala hili, katika hotuba hii tunajiwekea kikomo ufafanuzi wa jumla miundo ya kujirudia ya lugha ya SQL na majadiliano kesi rahisi swali la kujirudia.

Kuchanganya maswali ya aina moja

Onyesha nambari za wauzaji zilizoandikwa "muuzaji hodari" au "dhaifu". Muuzaji anachukuliwa kuwa mwenye nguvu ikiwa yeye wastani wa gharama biashara ni zaidi ya 500, dhaifu - chini ya 500(ombi limeonyeshwa kwenye Jedwali la 39 , matokeo - Jedwali 51 ):

KUNDI LA N_Muuzaji

KUWA NA wastani(Gharama)<500

KUNDI LA N_Muuzaji

KUWA na wastani(Gharama)>500;

Jedwali 51. Matokeo ya swali na opereta wa Muungano

Onyesha nambari za wauzaji zilizoandikwa "muuzaji hodari" au "dhaifu". Muuzaji aliye na thamani ya wastani ya muamala ya zaidi ya 500 anachukuliwa kuwa hodari, muuzaji dhaifu ni chini ya 500, akipangwa kwa shughuli.(ombi limeonyeshwa kwenye Jedwali la 40 , matokeo - Jedwali 52 ):

CHAGUA N_Muuzaji, "Muuzaji Dhaifu" kama Shughuli KUTOKA KWA Miamala

KUNDI LA N_Muuzaji

KUWA NA wastani(Gharama)<500

UNION CHAGUA N_Muuzaji, "Muuzaji Imara" kama Shughuli KUTOKA KWA Miamala

KUNDI LA N_Muuzaji

KUWA NA wastani(Gharama)>500

AMRI KWA Shughuli;

Jedwali 52. Matokeo ya ombi na Muungano na Amri na

Waendeshaji wa kati na isipokuwa hufanya kazi sawa, sambamba na shughuli za makutano na tofauti katika aljebra ya uhusiano. Kwa eneo la somo Orodha za "mauzo" za miji ya wanunuzi na wauzaji zinaweza zisiwe sawa, kwa hivyo tunaweza kutatua shida nyingi na orodha hizi, kama inavyoonyeshwa kwenye Jedwali. 53.

Jedwali 53. Kutumia join operators kwa maswali ya aina moja

Kwa Jani. 25 alitoa mfano wa ombi ambalo wasaidizi wa Ivanov walitafutwa. Swali linatokea la jinsi ya kujenga uongozi mzima wa wasaidizi, na sio tu wasaidizi wake wa moja kwa moja. Kwa kweli, tunahitaji kutumia swali hili hili la Laha. 25 kwa matokeo ya kuifanya mwenyewe, basi tena, nk, hadi wasaidizi wawe zaidi na zaidi viwango vya chini uongozi.

Unda safu ya wasaidizi wote wa Ivanov katika "urefu"(ombi limeonyeshwa kwenye Jedwali la 41 , matokeo - Jedwali 54 ).

Maswali ya kujirudia yanaweza kutambuliwa kwa neno kuu NA KURUDISHA. Ili kuitwa kwa kujirudia, swala lazima liwe na jina (katika kesi hii - Prod) Ombi lina sehemu mbili, zikiunganishwa kwa kutumia UNION. Katika sehemu ya kwanza - wakubwa, katika sehemu ya pili - wasaidizi wao. Swala hupata mtumwa wa kwanza, kisha mtumwa wa kwanza wa kwanza, na kadhalika. Hoja hizi huitwa hoja za utafutaji wa urefu mrefu.

Laha. 41. Swali la kujirudia “kwa urefu”

(CHAGUA N, Jina

KUTOKA kwa Wauzaji

WAPI Jina = 'Ivanov'

CHAGUA Wauzaji. N, Wauzaji.Jina

KUTOKA kwa Wauzaji, Mauzo

CHAGUA * KUTOKA Endelea;

Jedwali 54. Matokeo ya swali la kujirudia "kwa urefu"

Ikiwa tunahitaji kwanza kuorodhesha wasaidizi wote wa Ivanov, kisha wasaidizi wa Ivanov, nk, basi tunahitaji kutumia maswali ya kujirudia kwa upana kwa kutumia SEARCH BREADTH FIRST operator. Hoja huweka nambari ya kurudia kwa kutumia opereta ya SET.

Jenga uongozi wa wasaidizi wote wa Ivanov "kwa upana"(ombi limeonyeshwa kwenye Jedwali la 42 , matokeo - Jedwali 55 ).

Laha. 42. Swali la kujirudia la upana-kwanza

NA KUENDELEA KURUDISHA (N, Jina, N_Head) kama

(CHAGUA N, Jina

KUTOKA kwa Wauzaji

WAPI Jina = 'Ivanov'

KUTOKA kwa Wauzaji, Mauzo

WAPI Cont.N = Sellers.N_Chief);

TAFUTA UPANA KWANZA NA N_Chief, N

SET safu_ya_kuagiza

CHAGUA *KUTOKA Endelea

AGIZA KWA safu_ya_kuagiza;

Jedwali 55. Matokeo ya swala la "upana kwanza".

Kwa swala la kujirudia, hali ya kitanzi inawezekana. Ingawa hii haiko katika mfano wetu, tunaweza kudhani kuwa kuna hali wakati timu moja inafanya kazi kwenye miradi miwili, na mtu mmoja katika mradi wa kwanza ni bosi, na wa pili ni msaidizi, na kinyume chake, mtu wa pili. katika mradi wa kwanza ni chini. Na katika pili - bosi. Katika kesi hii, maswali ya awali ya kujirudia yatazunguka.

Jenga uongozi wa wasaidizi wote wa Ivanov, kwa kuzingatia uwezekano wa kitanzi(Jedwali la 43) .

Laha. 43. Swali la kujirudia kwa kuzingatia kitanzi

NA KUENDELEA KURUDISHA (N, Jina) kama

(CHAGUA N, Jina

KUTOKA kwa Wauzaji

WAPI Jina = 'Ivanov'

CHAGUA Wauzaji. N, Wauzaji. Jina

KUTOKA kwa Wauzaji, Mauzo

WAPI Cont.N = Sellers.N_Chief);

WEKA alama ya mzunguko iwe "Y" chaguo msingi "N"

KUTUMIA njia ya mzunguko

CHAGUA *KUTOKA Endelea

D/Z 6. Kwa mfano kutoka D/Z 4, njoo na maswali yafuatayo:

  1. Hoja ya jedwali moja inayotathmini kazi ya jumla kwa kutumia mahali, kuwa na, kuagiza kwa taarifa.
  2. Hoja ya uunganisho wa jedwali nyingi kwa kutumia kifungu, jedwali moja lazima litumike mara nyingi kwenye hoja chini ya lakabu.
  3. Hoja kwa kulia, kushoto au kujiunga kamili.
  4. Hoja yenye hoja mbili katika wapi na kuwa na vifungu
  5. Hoji kwa hoja ndogo ukitumia zote, zozote, au zipo.
  6. Swali lililowekwa kiota na muungano wa jedwali mbili (moja ya aina za jiunge), iliyounganishwa kwa njia isiyo ya moja kwa moja na ya tatu.
  7. Kuchanganya maswali ya aina moja.
  8. Swali la kujirudia.

Maswali ya kujipima:

1. Kuna tofauti gani kati ya kutumia kikundi cha waendeshaji, kikundi kwa rollup, kikundi kwa mchemraba wa rollup, kambi, mratibu kwa, kizigeu?

2. Kuna tofauti gani kati ya kutumia wapi na kuwa na kauli?

3. Swali gani linajiunga...kwenye mechi? wapi operator?

4. Ni aina gani ya operesheni algebra ya uhusiano inafanana na kauli ya wapi?

5. Je, ni operesheni gani ya kimahusiano ya aljebra ambayo mwendeshaji jiunge anahusiana nayo?

Matokeo haya yanaonekana kuwa muhimu zaidi. Sasa katika jedwali la ReachableFrom, sehemu ya Lengwa ina miji yote inayoweza kufikiwa kutoka kwa jiji lolote lililo katika sehemu ya Chanzo ya jedwali moja, na kufanya si zaidi ya kituo kimoja. Kisha, kwenye kupita inayofuata, kurudi tena kutashughulikia njia na vituo viwili vya kati na itaendelea kufanya hivyo mpaka miji yote inayoweza kufikiwa imepatikana.

Baada ya urejeshaji kukamilika, taarifa ya tatu na ya mwisho CHAGUA (ambayo haihusiki katika kujirudia) itachagua kutoka ReachableFrom tu miji hiyo inayoweza kufikiwa kutoka Portland. Katika mfano huu, unaweza kupata miji mingine sita, na kwa idadi ndogo ya vituo vya kati. Kwa hivyo huna haja ya kukimbilia kama vile umepanda nguzo yenye chemchemi.

Ukiangalia kwa karibu msimbo wa hoja unaojirudia, utaona kuwa haionekani kuwa rahisi kuliko hoja saba tofauti. Walakini, ombi hili lina faida mbili:

  • baada ya uzinduzi wake, uingiliaji wa nje hauhitajiki tena;
  • inafanya kazi haraka.

Ukiweza, fikiria shirika la ndege halisi ambalo lina miji mingi zaidi kwenye ramani yake ya njia. Na zaidi maeneo iwezekanavyo miadi, hizo faida zaidi kutoka kwa njia ya kujirudia.

Ni nini hufanya swali kujirudia? Kwamba tunafafanua Jedwali la ReachableFrom kulingana na yenyewe. Sehemu ya kujirudia ya ufafanuzi ni taarifa ya pili SELECT, ambayo iko mara baada ya MUUNGANO. InafikiwaKutoka ni jedwali la muda ambalo linajazwa na data wakati urejeshaji unatokea. Na ujazo huu unaendelea hadi maeneo yote yanayowezekana yawe katika ReachableFrom. Hakutakuwa na safu mlalo katika jedwali hili, kwa sababu opereta wa UNION hataziruhusu zipite. Urejeshaji utakapokamilika, jedwali la ReachableFrom litakuwa na miji yote inayoweza kufikiwa kutoka jiji lolote linaloanzia. Taarifa ya tatu na ya mwisho ya CHAGUA inarejesha tu miji ambayo unaweza kupata kutoka Portland. Kwa hivyo tunakutakia safari njema.

Ni wapi pengine ambapo unaweza kutumia swali la kujirudia?

Shida yoyote ambayo inaweza kuwakilishwa kama muundo wa mti inaweza kutatuliwa kwa swali la kujirudia. Mfano halisi wa jinsi maswali kama haya yanavyotumika katika tasnia ni usindikaji wa vifaa (mchakato wa kugeuza malighafi kuwa bidhaa ya mwisho). Hebu tuseme kampuni yako inatoa gari jipya la mseto la petroli-umeme. Mashine kama hiyo imekusanywa kutoka kwa vifaa (injini, betri, nk), ambayo, kwa upande wake, inajumuisha mikusanyiko ndogo (crankshaft, electrodes, nk), na hizo - kutoka kwa vipengele vidogo zaidi.

Data kuhusu vipengele hivi vyote vya vipengele huhifadhiwa ndani hifadhidata ya uhusiano ngumu sana - isipokuwa, bila shaka, hutumia kujirudia. Recursion hufanya iwezekanavyo, kuanzia na mashine nzima, kufikia sehemu ndogo kwa njia yoyote. Unataka kupata data kuhusu skrubu ya kupachika ambayo inashikilia terminal electrode hasi betri msaidizi? Hii inawezekana - na bila uwekezaji wa muda mwingi. Shughulika na haya Kazi za SQL inaweza kutumia muundo wa WITH RECURSIVE (recursive operator).

Kwa kuongezea, kujirudia ni asili kabisa katika uchambuzi wa "nini ikiwa". Kwa mfano, nini kitatokea ikiwa Vannevar Airlines itaamua kuacha kuruka kutoka Portland hadi Charlotte? Je, hii itaathiri vipi safari za ndege hadi miji inayofikiwa kwa sasa kutoka Portland? Swali la kujirudia litajibu maswali haya mara moja.