വിശകലനപരവും ആവർത്തനപരവുമായ അന്വേഷണങ്ങൾ രൂപപ്പെടുത്തുന്നതിനുള്ള ഉപകരണങ്ങൾ

ഉപയോഗിക്കുന്നതിന് കൂടുതൽ പ്രസ്താവനകൾ എഴുതുന്നതിനുള്ള ഒരു മാർഗം WITH നൽകുന്നു വലിയ അഭ്യർത്ഥനകൾ. കോമൺ ടേബിൾ എക്സ്പ്രഷൻസ് (CTE) എന്നും വിളിക്കപ്പെടുന്ന ഈ പ്രസ്താവനകൾ ഒരു ചോദ്യത്തിന് മാത്രമുള്ള താൽക്കാലിക പട്ടിക നിർവചനങ്ങളായി കണക്കാക്കാം. ക്ലോസിലുള്ള അധിക പ്രസ്താവന SELECT, INSERT, UPDATE, അല്ലെങ്കിൽ DELETE എന്നിവ ആകാം, കൂടാതെ ക്ലോസ് തന്നെ പ്രധാന പ്രസ്താവനയുമായി അറ്റാച്ചുചെയ്യുന്നു, അത് SELECT, INSERT, UPDATE, അല്ലെങ്കിൽ DELETE എന്നിവയും ആകാം.

7.8.1. കൂടെ തിരഞ്ഞെടുക്കുക

സങ്കീർണ്ണമായ ചോദ്യങ്ങളെ ലളിതമായ ഭാഗങ്ങളായി വിഭജിക്കുക എന്നതാണ് ക്ലോസിലുള്ള SELECT എന്നതിൻ്റെ പ്രധാന ലക്ഷ്യം. ഉദാഹരണത്തിന്, അഭ്യർത്ഥന:

റീജിയണൽ_സെയിൽസ് AS (പ്രദേശം തിരഞ്ഞെടുക്കുക, SUM(തുക) AS ഓർഡറുകൾ GROUP പ്രകാരമുള്ള മൊത്തം_സെയിൽസ്), top_regions AS (Regional_sales-ൽ നിന്ന് പ്രദേശം തിരഞ്ഞെടുക്കുക. ) AS product_units, SUM(തുക) ഓർഡറുകളിൽ നിന്നുള്ള ഉൽപ്പന്ന_വിൽപ്പനകൾ എവിടെയാണ് (മുകളിലെ_മേഖലകളിൽ നിന്ന് പ്രദേശം തിരഞ്ഞെടുക്കുക) പ്രദേശം അനുസരിച്ച് ഗ്രൂപ്പ്, ഉൽപ്പന്നം;

പ്രമുഖ പ്രദേശങ്ങൾക്കായി മാത്രം വിൽപ്പന ഫലങ്ങൾ പ്രദർശിപ്പിക്കുന്നു. വിത്ത് ക്ലോസ് രണ്ടിനെ നിർവചിക്കുന്നു അധിക ഓപ്പറേറ്റർറീജിയണൽ_സെയിൽസ്, ടോപ്പ്_ റീജിയണുകൾ അങ്ങനെ റീജിയണൽ_സെയിൽസിൻ്റെ ഫലം ടോപ്പ്_ റീജിയണുകളിലും ടോപ്പ്_ റീജിയണുകളുടെ ഫലം പ്രധാനത്തിലും ഉപയോഗിക്കുന്നു ചോദ്യം തിരഞ്ഞെടുക്കുക. ഈ ഉദാഹരണം ഉപയോഗിച്ച് മാറ്റി എഴുതാം, എന്നാൽ ഞങ്ങൾക്ക് രണ്ട് തലത്തിലുള്ള നെസ്റ്റഡ് SELECT സബ്ക്വറികൾ ആവശ്യമാണ്. മുകളിൽ കാണിച്ചിരിക്കുന്ന രീതി ഉപയോഗിച്ച് ഇത് കുറച്ച് എളുപ്പത്തിൽ ചെയ്യാം.

ഓപ്‌ഷണൽ റിക്യുഴ്‌സീവ് ക്ലോസ് ഒരു സൗകര്യപ്രദമായ വാക്യഘടനയിൽ നിന്ന് സാധാരണ SQL-ൽ സാധ്യമല്ലാത്ത എന്തെങ്കിലും ചെയ്യുന്നതിനുള്ള ഒരു മാർഗമായി മാറുന്നു. RECURSIVE ഉപയോഗിക്കുന്നതിലൂടെ, ഒരു ചോദ്യത്തിന് അതിൻ്റേതായ ഫലം ആക്സസ് ചെയ്യാൻ കഴിയും. 1 മുതൽ 100 ​​വരെയുള്ള സംഖ്യകൾ സംഗ്രഹിക്കുന്ന വളരെ ലളിതമായ ഉദാഹരണം:

ആവർത്തന t(n) പോലെ (മൂല്യം (1) യൂണിയൻ എല്ലാം n+1 തിരഞ്ഞെടുക്കുക എവിടെ നിന്ന് n< 100) SELECT sum(n) FROM t;

IN പൊതുവായ കാഴ്ചചോദ്യത്തോടുകൂടിയ ഒരു ആവർത്തനരൂപം എപ്പോഴും ഇങ്ങനെയാണ് എഴുതുന്നത് ആവർത്തന ഭാഗമല്ല, പിന്നെ UNION (അല്ലെങ്കിൽ UNION ALL), തുടർന്ന് ആവർത്തന ഭാഗം, ആവർത്തന ഭാഗത്ത് മാത്രമേ നിങ്ങൾക്ക് അന്വേഷണ ഫലം ആക്സസ് ചെയ്യാൻ കഴിയൂ. അത്തരമൊരു അഭ്യർത്ഥന ഇനിപ്പറയുന്ന രീതിയിൽ നടപ്പിലാക്കുന്നു:

ഒരു ആവർത്തന ചോദ്യം വിലയിരുത്തുന്നു

    നോൺ-ആവർത്തന ഭാഗം കണക്കാക്കുന്നു. UNION-ന് (എന്നാൽ UNION ALL അല്ല), തനിപ്പകർപ്പ് വരികൾ നിരസിച്ചു. ബാക്കിയുള്ള എല്ലാ വരികളും ആവർത്തന ചോദ്യത്തിൻ്റെ ഫലത്തിൽ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്, അവ താൽക്കാലികമായി സ്ഥാപിക്കുകയും ചെയ്യുന്നു വർക്ക്ഷീറ്റ്.

    വർക്ക് ടേബിൾ ശൂന്യമല്ലെങ്കിൽ, ഇനിപ്പറയുന്ന ഘട്ടങ്ങൾ ആവർത്തിക്കുന്നു:

    1. ആവർത്തന ഭാഗം വിലയിരുത്തപ്പെടുന്നു, അതിനാൽ അന്വേഷണത്തിലേക്കുള്ള ആവർത്തന റഫറൻസ് തന്നെ വർക്ക്ടേബിളിലെ നിലവിലെ ഉള്ളടക്കങ്ങളിലേക്ക് പ്രവേശിക്കുന്നു. UNION-ന് (എന്നാൽ UNION ALL അല്ല), മുമ്പ് ലഭിച്ചവയുടെ തനിപ്പകർപ്പുള്ള ഡ്യൂപ്ലിക്കേറ്റ് വരികളും വരികളും നിരസിക്കപ്പെടും. ബാക്കിയുള്ള എല്ലാ വരികളും ആവർത്തന ചോദ്യത്തിൻ്റെ ഫലത്തിൽ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്, അവ താൽക്കാലികമായി സ്ഥാപിക്കുകയും ചെയ്യുന്നു ഇൻ്റർമീഡിയറ്റ് പട്ടിക.

      വർക്ക് ടേബിളിലെ ഉള്ളടക്കങ്ങൾ സ്റ്റേജിംഗ് ടേബിളിലെ ഉള്ളടക്കങ്ങൾ ഉപയോഗിച്ച് മാറ്റിസ്ഥാപിക്കുന്നു, തുടർന്ന് സ്റ്റേജിംഗ് ടേബിൾ മായ്‌ക്കുന്നു.

മുകളിൽ കാണിച്ചിരിക്കുന്ന ഉദാഹരണത്തിൽ, ഓരോ ഘട്ടത്തിലെയും വർക്ക് ടേബിളിൽ ഒരു വരി മാത്രമേ അടങ്ങിയിട്ടുള്ളൂ കൂടാതെ 1 മുതൽ 100 ​​വരെയുള്ള മൂല്യങ്ങൾ അതിൽ ക്രമാനുഗതമായി ശേഖരിക്കപ്പെടുന്നു. നൂറാം ഘട്ടത്തിൽ, നന്ദി എവിടെ അവസ്ഥ, ഒന്നും തിരികെ നൽകില്ല, അതിനാൽ അന്വേഷണ മൂല്യനിർണ്ണയം അവസാനിക്കുന്നു.

ഹൈരാർക്കിക്കൽ അല്ലെങ്കിൽ ട്രീ ഡാറ്റാ സ്ട്രക്ച്ചറുകൾക്കൊപ്പം പ്രവർത്തിക്കാൻ ആവർത്തന അന്വേഷണങ്ങൾ സാധാരണയായി ഉപയോഗിക്കുന്നു. പോലെ ഉപയോഗപ്രദമായ ഉദാഹരണംനേരിട്ടുള്ള കണക്ഷനുകളുള്ള ഒരു പട്ടിക മാത്രം ഉപയോഗിച്ച് ഒരു ഉൽപ്പന്നത്തിൻ്റെ പ്രത്യക്ഷവും പരോക്ഷവുമായ എല്ലാ ഘടകങ്ങളും കണ്ടെത്തുന്ന ഒരു അന്വേഷണം നിങ്ങൾക്ക് സൃഷ്ടിക്കാൻ കഴിയും:

ആവർത്തിച്ചുള്ള ഉൾപ്പെടുത്തിയിരിക്കുന്ന_ഭാഗങ്ങൾ (സബ്_പാർട്ട്, ഭാഗം, അളവ്) എഎസ് (ഉപ_ഭാഗം, ഭാഗം, അളവ് തിരഞ്ഞെടുക്കുക എവിടെ ഭാഗം = "നമ്മുടെ_ഉൽപ്പന്നം" യൂണിയൻ എല്ലാം തിരഞ്ഞെടുക്കുക p.sub_part, p.part, p.quantity from include_parts pr, ഭാഗങ്ങൾ p WHERE p. = pr.sub_part) ഉപ_ഭാഗം, SUM(അളവ്) മൊത്തം_അളവായി തിരഞ്ഞെടുക്കുക

ആവർത്തന ചോദ്യങ്ങളുമായി പ്രവർത്തിക്കുമ്പോൾ, അന്വേഷണത്തിൻ്റെ ആവർത്തന ഭാഗം ഏതെങ്കിലും ട്യൂപ്പിൾ (വരികൾ) തിരികെ നൽകുന്നില്ലെന്ന് ഉറപ്പാക്കേണ്ടത് പ്രധാനമാണ്, അല്ലാത്തപക്ഷം ലൂപ്പ് അനന്തമായിരിക്കും. ചിലപ്പോൾ ഇതിന് UNION ALL എന്നതിനുപകരം UNION ഉപയോഗിച്ചാൽ മതിയാകും, കാരണം ഇത് ഇതിനകം ഫലത്തിലുള്ള വരികൾ നിരസിക്കും. എന്നിരുന്നാലും, പലപ്പോഴും ലൂപ്പ് മുമ്പത്തെവയുമായി കൃത്യമായി പൊരുത്തപ്പെടാത്ത വരികൾ നിർമ്മിക്കുന്നു: അത്തരം സന്ദർഭങ്ങളിൽ, നിലവിലെ പോയിൻ്റ് നേരത്തെ എത്തിയിട്ടുണ്ടോ എന്ന് നിർണ്ണയിക്കാൻ ഒന്നോ അതിലധികമോ ഫീൽഡുകൾ പരിശോധിക്കുന്നത് അർത്ഥമാക്കാം. സ്റ്റാൻഡേർഡ് രീതിഇതിനകം പ്രോസസ്സ് ചെയ്ത മൂല്യങ്ങളുള്ള ഒരു അറേ കണക്കാക്കുക എന്നതാണ് അത്തരം പ്രശ്നങ്ങൾക്കുള്ള പരിഹാരം. ഉദാഹരണത്തിന്, ലിങ്ക് ഫീൽഡ് വഴി ഗ്രാഫ് പട്ടിക നോക്കുന്ന ഇനിപ്പറയുന്ന ചോദ്യം പരിഗണിക്കുക:

ആവർത്തിച്ചുള്ള തിരയൽ_ഗ്രാഫ് ഉപയോഗിച്ച് (ഐഡി, ലിങ്ക്, ഡാറ്റ, ഡെപ്ത്) എഎസ് (ജി.ഐഡി, ജി.ലിങ്ക്, ജി.ഡാറ്റ തിരഞ്ഞെടുക്കുക, ഗ്രാഫിൽ നിന്ന് 1 ജി യൂണിയൻ എല്ലാ സെലക്ട് ജി.ഐഡി, ജി.ലിങ്ക്, ജി.ഡാറ്റ, എസ്ജി.ഡെപ്ത് + 1 ഗ്രാഫിൽ നിന്ന് g, search_graph sg എവിടെയാണ് g.id = sg.link) തിരഞ്ഞെടുക്കുക * തിരയൽ_ഗ്രാഫിൽ നിന്ന്;

ലിങ്ക് ലിങ്കുകളിൽ ലൂപ്പുകൾ ഉണ്ടെങ്കിൽ ഈ അഭ്യർത്ഥന ലൂപ്പ് ചെയ്യും. അതിൻ്റെ ഫലമായി നമുക്ക് ലഭിക്കേണ്ടതിനാൽ " ആഴം", UNION ALL UNION എന്നാക്കി മാറ്റുന്നത് ലൂപ്പ് ഒഴിവാക്കില്ല. പകരം, നമ്മൾ ഇതിനകം നേടിയത് എന്താണെന്ന് എങ്ങനെയെങ്കിലും നിർണ്ണയിക്കണം നിലവിലെ ലൈൻ, കുറെ നടന്നു. ഇത് ചെയ്യുന്നതിന്, ഞങ്ങൾ രണ്ട് നിരകൾ പാത്തും സൈക്കിളും ചേർത്ത് സൈക്കിൾ പരിരക്ഷിത ചോദ്യം നേടുന്നു:

ആവർത്തിച്ചുള്ള തിരയൽ_ഗ്രാഫ് (ഐഡി, ലിങ്ക്, ഡാറ്റ, ഡെപ്ത്, പാത്ത്, സൈക്കിൾ) എഎസ് (g.id, g.link, g.data, 1, ARRAY, ഗ്രാഫിൽ നിന്ന് തെറ്റ് തിരഞ്ഞെടുക്കുക g UNION എല്ലാം തിരഞ്ഞെടുക്കുക g.id, g.link, g.data, sg.depth + 1, path || g.id, g.id = ഏതെങ്കിലും (പാത്ത്) ഗ്രാഫ് g, search_graph sg എവിടെയാണ് g.id = sg.link കൂടാതെ സൈക്കിൾ അല്ല) * സെർച്ച്_ഗ്രാഫിൽ നിന്ന് തിരഞ്ഞെടുക്കുക;

ലൂപ്പുകൾ തടയുന്നതിനു പുറമേ, അറേ മൂല്യങ്ങൾ പ്രതിനിധീകരിക്കുന്നതിന് പലപ്പോഴും അവയ്ക്ക് ഉപയോഗപ്രദമാണ്. വഴികൾ »ഒരു പ്രത്യേക വരിയിലേക്ക് നയിക്കുന്നു.

പൊതുവേ, ഒരു സൈക്കിൾ കണ്ടുപിടിക്കാൻ നിങ്ങൾക്ക് ഒന്നിലധികം ഫീൽഡുകൾ പരിശോധിക്കേണ്ടിവരുമ്പോൾ, നിങ്ങൾ സ്ട്രിംഗുകളുടെ ഒരു നിര ഉപയോഗിക്കണം. ഉദാഹരണത്തിന്, നിങ്ങൾക്ക് f1, f2 ഫീൽഡുകൾ താരതമ്യം ചെയ്യണമെങ്കിൽ:

ആവർത്തിച്ചുള്ള തിരയൽ_ഗ്രാഫ് (ഐഡി, ലിങ്ക്, ഡാറ്റ, ഡെപ്ത്, പാത്ത്, സൈക്കിൾ) എഎസ് (g.id, g.link, g.data, 1, ARRAY, ഗ്രാഫിൽ നിന്ന് തെറ്റ് തിരഞ്ഞെടുക്കുക g UNION എല്ലാം തിരഞ്ഞെടുക്കുക g.id, g.link, g.data, sg.depth + 1, path || ROW(g.f1, g.f2), ROW(g.f1, g.f2) = ഗ്രാഫിൽ നിന്ന് ഏതെങ്കിലും (പാത) g, search_graph sg WHERE g.id = sg.link കൂടാതെ സൈക്കിൾ അല്ല) സെർച്ച്_ഗ്രാഫിൽ നിന്ന് * തിരഞ്ഞെടുക്കുക;

സൂചന

ഒരു സൈക്കിൾ തിരിച്ചറിയാൻ പലപ്പോഴും ഒരു ഫീൽഡ് മതിയാകും, തുടർന്ന് ROW() ഒഴിവാക്കാവുന്നതാണ്. ഇത് ഒരു ഡാറ്റ അറേ ഉപയോഗിക്കില്ല സംയുക്ത തരം, എന്നാൽ കൂടുതൽ കാര്യക്ഷമമായ ഒരു ലളിതമായ അറേ.

സൂചന

ഈ ആവർത്തന അന്വേഷണ മൂല്യനിർണ്ണയ അൽഗോരിതം നിമജ്ജന പാതയിൽ ക്രമീകരിച്ച നോഡുകൾ നിർമ്മിക്കുന്നു. ഫലങ്ങൾ ആഴത്തിൽ അടുക്കുന്നതിന്, ബാഹ്യ അന്വേഷണത്തിലേക്ക് നിങ്ങൾക്ക് ഒരു ഓർഡർ പ്രകാരം കോളം ചേർക്കാവുന്നതാണ്. പാത", മുകളിൽ കാണിച്ചിരിക്കുന്നതുപോലെ ലഭിച്ചു.

ലൂപ്പ് ആയേക്കാവുന്ന ചോദ്യങ്ങൾ പരിശോധിക്കുന്നതിനുള്ള ഒരു നല്ല ട്രിക്ക് പാരൻ്റ് ക്വറിയിൽ LIMIT ചേർക്കുക എന്നതാണ്. ഉദാഹരണത്തിന്, നിങ്ങൾ ഒരു LIMIT ക്ലോസ് ചേർത്തില്ലെങ്കിൽ ഇനിപ്പറയുന്ന ചോദ്യം ലൂപ്പ് ചെയ്യും:

ആവർത്തന t(n) ആയി (1 യൂണിയൻ എല്ലാം തിരഞ്ഞെടുക്കുക t-ൽ നിന്ന് n+1 തിരഞ്ഞെടുക്കുക) t പരിധി 100-ൽ നിന്ന് n തിരഞ്ഞെടുക്കുക;

എന്നാൽ അകത്ത് ഈ സാഹചര്യത്തിൽഇത് സംഭവിക്കുന്നില്ല, കാരണം ഇൻ PostgreSQLരക്ഷാകർതൃ ചോദ്യം യഥാർത്ഥത്തിൽ സ്വീകരിക്കുന്ന അത്രയും വരികൾ ഒരു ചോദ്യം ഉള്ളത് നിർമ്മിക്കുന്നു. ഉൽപ്പാദന പരിതസ്ഥിതിയിൽ ഈ സാങ്കേതികവിദ്യ ശുപാർശ ചെയ്യുന്നില്ല, കാരണം മറ്റ് സിസ്റ്റങ്ങൾ വ്യത്യസ്തമായി പെരുമാറിയേക്കാം. കൂടാതെ, ബാഹ്യ അന്വേഷണം ഒരു ആവർത്തന അന്വേഷണത്തിൻ്റെ ഫലങ്ങൾ അടുക്കുകയോ മറ്റൊരു ടേബിളുമായി അവയെ കൂട്ടിച്ചേർക്കുകയോ ആണെങ്കിൽ ഇത് പ്രവർത്തിക്കില്ല, കാരണം അത്തരം സന്ദർഭങ്ങളിൽ ബാഹ്യ അന്വേഷണം സാധാരണയായി അന്വേഷണ ഫലത്തോടൊപ്പം മുഴുവൻ ചോദ്യവും തിരഞ്ഞെടുക്കും.

ചോദ്യങ്ങൾ ഉണ്ട് ഉപയോഗപ്രദമായ സ്വത്ത്- ആ ചോദ്യം അല്ലെങ്കിൽ അയൽപക്കത്തുള്ള ചോദ്യങ്ങൾ ഒന്നിലധികം തവണ ആക്‌സസ് ചെയ്‌താലും, മുഴുവൻ രക്ഷാകർതൃ അന്വേഷണത്തിനും ഒരിക്കൽ മാത്രമേ അവ വിലയിരുത്തപ്പെടുകയുള്ളൂ. ഈ രീതിയിൽ, ഒപ്റ്റിമൈസേഷൻ ആവശ്യങ്ങൾക്കായി, ഒന്നിലധികം സ്ഥലങ്ങളിൽ ഫലങ്ങൾ ആവശ്യമുള്ള സങ്കീർണ്ണമായ കണക്കുകൂട്ടലുകൾ അന്വേഷണങ്ങളിൽ ഉൾപ്പെടുത്താം. കൂടാതെ, അത്തരം അന്വേഷണങ്ങൾ അനാവശ്യമായ പ്രവർത്തന മൂല്യനിർണ്ണയങ്ങൾ ഒഴിവാക്കുന്നു പാർശ്വ ഫലങ്ങൾ. എന്നിരുന്നാലും, ഉണ്ട് പിൻ വശം- ഒപ്റ്റിമൈസറിന് ഒരു പാരൻ്റ് ക്വറിയുടെ നിയന്ത്രണങ്ങൾ ഒരു സാധാരണ സബ്ക്വറിക്ക് സാധ്യമായ രീതിയിൽ ഒരു ചോദ്യം ഉപയോഗിച്ച് പ്രചരിപ്പിക്കാൻ കഴിയില്ല. ചോദ്യം ഉള്ളത് സാധാരണയായി അക്ഷരാർത്ഥത്തിൽ നടപ്പിലാക്കുകയും എല്ലാ വരികളും തിരികെ നൽകുകയും ചെയ്യുന്നു, പാരൻ്റ് ചോദ്യം പിന്നീട് നിരസിച്ചേക്കാവുന്നവ ഉൾപ്പെടെ. (എന്നാൽ മുകളിൽ സൂചിപ്പിച്ചതുപോലെ, ഈ അന്വേഷണത്തിൻ്റെ റഫറൻസ് മാത്രം ആവശ്യമെങ്കിൽ കണക്കുകൂട്ടൽ നേരത്തെ നിർത്തിയേക്കാം പരിമിതമായ എണ്ണംലൈനുകൾ.)

മുകളിലുള്ള ഉദാഹരണങ്ങൾ SELECT എന്ന ക്ലോസ് ഉള്ളത് മാത്രമേ കാണിക്കൂ, എന്നാൽ ഇത് INSERT , UPDATE , DELETE എന്നീ കമാൻഡുകൾക്കൊപ്പം അതേ രീതിയിൽ ഉപയോഗിക്കാം. ഓരോ സാഹചര്യത്തിലും, ഇത് പ്രധാന കമാൻഡിൽ ആക്സസ് ചെയ്യാൻ കഴിയുന്ന ഒരു താൽക്കാലിക പട്ടിക സൃഷ്ടിക്കുന്നു.

7.8.2. ഉപയോഗിച്ച് ഡാറ്റ മാറ്റുന്നു

ക്ലോസിനൊപ്പം നിങ്ങൾക്ക് ഡാറ്റ പരിഷ്‌ക്കരണ പ്രസ്താവനകളും (ഇൻസേർട്ട് ചെയ്യുക, അപ്‌ഡേറ്റ് ചെയ്യുക അല്ലെങ്കിൽ ഇല്ലാതാക്കുക) ഉപയോഗിക്കാം. ഒരു അഭ്യർത്ഥനയിൽ ഒരേസമയം നിരവധി വ്യത്യസ്ത പ്രവർത്തനങ്ങൾ നടത്താൻ ഇത് നിങ്ങളെ അനുവദിക്കുന്നു. ഉദാഹരണത്തിന്:

നീക്കിയ_വരികൾ പോലെ ("തീയതി" >= "2010-10-01", "തീയതി" എന്നിവയിൽ നിന്ന് ഇല്ലാതാക്കുക< "2010-11-01" RETURNING *) INSERT INTO products_log SELECT * FROM moved_rows;

ഈ ചോദ്യം യഥാർത്ഥത്തിൽ ഉൽപ്പന്നങ്ങളിൽ നിന്ന് ഉൽപ്പന്നങ്ങൾ_ലോഗിലേക്ക് വരികളെ നീക്കുന്നു. പ്രസ്താവന ഇല്ലാതാക്കുകകൂടെ, ഉൽപ്പന്നങ്ങളിൽ നിന്ന് നിർദ്ദിഷ്‌ട വരികൾ നീക്കം ചെയ്യുകയും അവയുടെ ഉള്ളടക്കങ്ങൾ ഒരു റിട്ടേണിംഗ് ക്ലോസിൽ തിരികെ നൽകുകയും ചെയ്യുന്നു; തുടർന്ന് പ്രധാന ചോദ്യം ഈ ഉള്ളടക്കം വായിക്കുകയും ഉൽപ്പന്നങ്ങൾ_ലോഗ് പട്ടികയിലേക്ക് തിരുകുകയും ചെയ്യുന്നു.

ഈ കേസിലെ ക്ലോസ് ഉള്ളത് INSERT സ്റ്റേറ്റ്‌മെൻ്റിലാണ് അറ്റാച്ച് ചെയ്‌തിരിക്കുന്നത്, INSERT-ൽ നെസ്റ്റഡ് ചെയ്‌തിരിക്കുന്ന SELECT എന്നതിലേക്കല്ല. ഇത് ആവശ്യമാണ് കാരണം ഡാറ്റ മാറ്റുന്ന പ്രസ്താവനകൾ മാത്രമേ WITH-ൽ അടങ്ങിയിരിക്കാൻ കഴിയൂ ഉയർന്ന നിലഅഭ്യർത്ഥന. എന്നിരുന്നാലും, അവ ബാധകമാണ് സാധാരണ നിയമങ്ങൾദൃശ്യപരതയോടെ, അതിലൂടെ ഒരു നെസ്റ്റഡ് SELECT സ്റ്റേറ്റ്‌മെൻ്റിൽ നിന്നും WITH ൻ്റെ ഫലം ആക്‌സസ് ചെയ്യാൻ കഴിയും.

ഈ ഉദാഹരണത്തിൽ കാണിച്ചിരിക്കുന്നതുപോലെ, WITH-ലെ ഡാറ്റ പരിഷ്‌ക്കരിക്കുന്ന പ്രസ്താവനകൾ സാധാരണയായി ഒരു റിട്ടേണിംഗ് ക്ലോസിനൊപ്പം ഉണ്ടായിരിക്കും (വിഭാഗം 6.4 കാണുക). ബാക്കിയുള്ള ചോദ്യങ്ങളിൽ ഉപയോഗിക്കാനാകുന്ന ഒരു താൽക്കാലിക ടേബിൾ റിട്ടേണിങ്ങിൻ്റെ ഫലത്തിൽ നിന്നാണ് സൃഷ്‌ടിക്കപ്പെട്ടതെന്ന് മനസ്സിലാക്കേണ്ടത് പ്രധാനമാണ്, കൂടാതെ അല്ലഓപ്പറേറ്റർ ടാർഗെറ്റ് പട്ടിക. WITH എന്നതിലെ ഡാറ്റ പരിഷ്‌ക്കരിക്കുന്ന പ്രസ്താവനയ്‌ക്കൊപ്പം ഒരു റിട്ടേണിംഗ് ക്ലോസ് ഇല്ലെങ്കിൽ, താൽക്കാലിക ടേബിൾ സൃഷ്‌ടിക്കപ്പെടുന്നില്ല, കൂടാതെ ചോദ്യത്തിൻ്റെ ബാക്കി ഭാഗങ്ങളിൽ അത് ആക്‌സസ് ചെയ്യാൻ കഴിയില്ല. എന്നിരുന്നാലും, അത്തരമൊരു അഭ്യർത്ഥന ഇപ്പോഴും നടപ്പിലാക്കും. ഉദാഹരണത്തിന്, ഇനിപ്പറയുന്നത് വളരെ പ്രായോഗികമല്ലെന്ന് നമുക്ക് പറയാം:

ടി ആയി (ഫൂവിൽ നിന്ന് ഇല്ലാതാക്കുക) ബാറിൽ നിന്ന് ഇല്ലാതാക്കുക;

ഇത് ടേബിളുകൾ ഫൂ, ബാർ എന്നിവയിൽ നിന്ന് എല്ലാ വരികളും ഇല്ലാതാക്കും. ഈ സാഹചര്യത്തിൽ, ബാറിൽ നിന്ന് നീക്കം ചെയ്‌ത വരികളെ അടിസ്ഥാനമാക്കി മാത്രമേ ക്ലയൻ്റിന് ലഭിക്കുന്ന ഉൾപ്പെട്ട വരികളുടെ എണ്ണം കണക്കാക്കൂ.

ആവർത്തിച്ചുള്ള ഉൾപ്പെടുത്തിയിട്ടുള്ള_ഭാഗങ്ങൾ (sub_part, ഭാഗം) AS (ഉപ_ഭാഗം, ഭാഗങ്ങളിൽ നിന്ന് ഭാഗം തിരഞ്ഞെടുക്കുക ഭാഗം = "ഞങ്ങളുടെ_ഉൽപ്പന്നം" UNION എല്ലാം തിരഞ്ഞെടുക്കുക p.sub_part, p.part from include_parts pr, ഭാഗങ്ങൾ p എവിടെ p.part = pr.sub_part) ഭാഗങ്ങൾ ഇല്ലാതാക്കുക ഭാഗം എവിടെയാണ് (ഉൾപ്പെടുത്തിയ_ഭാഗങ്ങളിൽ നിന്ന് ഭാഗം തിരഞ്ഞെടുക്കുക);

ഈ ചോദ്യം ഉൽപ്പന്നത്തിൻ്റെ പ്രത്യക്ഷവും പരോക്ഷവുമായ എല്ലാ ഘടകങ്ങളും നീക്കം ചെയ്യുന്നു.

WITH-ൽ ഡാറ്റ പരിഷ്‌ക്കരിക്കുന്ന ഓപ്പറേറ്റർമാർ ഒരു തവണ മാത്രമേ എക്‌സിക്യൂട്ട് ചെയ്യുകയുള്ളൂ, പ്രധാന ചോദ്യം അവരുടെ ഫലം അംഗീകരിക്കുന്നുണ്ടോ എന്നത് പരിഗണിക്കാതെ തന്നെ. വിത്ത് എന്നതിലെ SELECT-ൻ്റെ സ്വഭാവത്തിൽ നിന്ന് ഇത് വ്യത്യസ്തമാണെന്നത് ശ്രദ്ധിക്കുക: മുമ്പത്തെ വിഭാഗത്തിൽ ചർച്ച ചെയ്തതുപോലെ, പ്രധാന ചോദ്യം അതിൻ്റെ ഫലങ്ങൾ ക്ലെയിം ചെയ്യുന്നിടത്തോളം മാത്രമേ SELECT എക്സിക്യൂട്ട് ചെയ്യൂ.

WITH-ലെ നെസ്റ്റഡ് സ്റ്റേറ്റ്‌മെൻ്റുകൾ പരസ്പരം ഒപ്പം പ്രധാന ചോദ്യത്തിനൊപ്പം ഒരേസമയം നടപ്പിലാക്കുന്നു. അതിനാൽ, WITH-ലെ പ്രസ്താവനകൾ യഥാർത്ഥത്തിൽ ഡാറ്റയെ മാറ്റുന്ന ക്രമം പ്രവചനാതീതമാണ്. ഈ പ്രസ്താവനകളെല്ലാം ഒന്ന് ഉപയോഗിച്ച് നടപ്പിലാക്കുന്നു ഡാറ്റ സ്നാപ്പ്ഷോട്ട്(അധ്യായം 13 കാണുക) അതിനാൽ അവർക്ക് കഴിയില്ല " കാണുക"അവ ഓരോന്നും ടാർഗെറ്റ് ടേബിളുകൾ എങ്ങനെ മാറ്റുന്നു. ഇത് യഥാർത്ഥ വരി മാറ്റ ഓർഡറിൻ്റെ പ്രവചനാതീതത കുറയ്ക്കുന്നു, കൂടാതെ നെസ്റ്റഡ് വിത്ത് സ്റ്റേറ്റ്‌മെൻ്റുകളിൽ നിന്ന് പ്രധാന അന്വേഷണത്തിലേക്ക് മാറ്റങ്ങൾ കൈമാറുന്നതിനുള്ള ഒരേയൊരു ഓപ്ഷൻ റിട്ടേണിംഗ് ആണെന്നാണ് അർത്ഥമാക്കുന്നത്. ഉദാഹരണത്തിന്, ഈ സാഹചര്യത്തിൽ:

ടി ആയി (ഉൽപ്പന്നങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുക വില = വില * 1.05 റിട്ടേണിംഗ് *) ഉൽപ്പന്നങ്ങളിൽ നിന്ന് * തിരഞ്ഞെടുക്കുക;

അപ്‌ഡേറ്റ് പ്രവർത്തനത്തിന് മുമ്പുള്ള വിലകൾ, അതേ സമയം അന്വേഷണത്തിൽ ബാഹ്യ SELECT സ്റ്റേറ്റ്‌മെൻ്റ് തിരികെ നൽകും

ടി ആയി (ഉൽപ്പന്നങ്ങൾ അപ്ഡേറ്റ് ചെയ്യുക വില = വില * 1.05 മടങ്ങുന്നു *) തിരഞ്ഞെടുക്കുക * ടിയിൽ നിന്ന്;

ഒരു ബാഹ്യ SELECT മാറ്റിയ ഡാറ്റ തിരികെ നൽകും.

ഒരേ പ്രസ്താവനയ്ക്കുള്ളിൽ ഒരേ സ്ട്രിംഗ് ഒന്നിലധികം തവണ മാറ്റുന്നത് പിന്തുണയ്ക്കുന്നില്ല. നിരവധി മാറ്റങ്ങളിൽ ഒന്ന് മാത്രമേ സംഭവിക്കൂ, ഏതാണ് പലപ്പോഴും വളരെ ബുദ്ധിമുട്ടുള്ള (ചിലപ്പോൾ പോലും അസാധ്യമായത്) വിശ്വസനീയമായി നിർണ്ണയിക്കുക. ഒരു വരി ഇല്ലാതാക്കുകയും അതേ പ്രസ്താവനയിൽ മാറ്റം വരുത്തുകയും ചെയ്യുമ്പോൾ ഇത് ബാധകമാണ്: ഫലം ഒരു അപ്ഡേറ്റ് മാത്രമായിരിക്കും. അതിനാൽ, പൊതുവേ, അത്തരം ഓവർലാപ്പിംഗ് പ്രവർത്തനങ്ങൾ ഒഴിവാക്കണം. പ്രത്യേകിച്ചും, ഉപചോദ്യങ്ങൾ ഉപയോഗിച്ച് ഒഴിവാക്കുക, പ്രധാന പ്രസ്താവന അല്ലെങ്കിൽ അതിനുള്ളിലെ പ്രസ്താവനകൾ പരിഷ്കരിച്ച വരികളെ ഇത് ബാധിക്കും. അത്തരം അഭ്യർത്ഥനകളുടെ ഫലം പ്രവചനാതീതമായിരിക്കും.

നിലവിൽ, WITH-ൽ ഡാറ്റ പരിഷ്‌ക്കരിക്കുന്ന ഒരു പ്രസ്താവനയ്ക്ക് ഏത് പട്ടികയെ ടാർഗെറ്റുചെയ്യാൻ കഴിയില്ല സോപാധിക ഭരണംഒന്നിലധികം പ്രസ്‌താവനകൾ അടങ്ങിയതാണെങ്കിൽ ഒരു ALSO അല്ലെങ്കിൽ പകരം നിയമം.

സ്റ്റാൻഡേർഡ് SQL:1999 കൂടാതെ മുമ്പ് അനുയോജ്യമല്ലാത്ത ആപ്ലിക്കേഷനുകളിൽ ഭാഷ ഉപയോഗിക്കുന്നതിനുള്ള സാധ്യത തുറക്കുന്നു. അത് ഏകദേശംവിശകലനത്തിൻ്റെ സാധ്യതകളെക്കുറിച്ചും ആവർത്തന ചോദ്യങ്ങൾ . ഈ വിഷയങ്ങൾ യുക്തിസഹമായി ബന്ധിപ്പിച്ചിട്ടില്ല; അനുബന്ധ ഉപകരണങ്ങൾ വളരെ ബുദ്ധിമുട്ടുള്ളതും എല്ലായ്പ്പോഴും മനസ്സിലാക്കാൻ എളുപ്പവുമല്ല എന്ന വസ്തുതയാൽ മാത്രം അവ ഏകീകരിക്കപ്പെടുന്നു. ഈ ചെറിയ പ്രഭാഷണത്തിൽ ഞങ്ങൾ നൽകാൻ ശ്രമിക്കുന്നില്ല പൂർണ്ണ വിവരണം SQL സ്റ്റാൻഡേർഡിൽ വ്യക്തമാക്കിയ കഴിവുകൾ. നമ്മുടെ ലക്ഷ്യം എന്നത് മാത്രമാണ് പൊതുവായ രൂപരേഖഈ ദിശകളിലെ SQL സമീപനം വിവരിക്കുക.

അനലിറ്റിക്കൽ ആപ്ലിക്കേഷനുകൾക്ക് സാധാരണയായി ഡാറ്റാബേസിൽ നേരിട്ട് സംഭരിച്ചിരിക്കുന്ന വിശദമായ ഡാറ്റ ആവശ്യമില്ല, എന്നാൽ അവയുടെ ചില പൊതുവൽക്കരണങ്ങളും അഗ്രഗേറ്റുകളും. ഉദാഹരണത്തിന്, അനലിറ്റിക്‌സിന് താൽപ്പര്യമില്ല വേതന നിർദ്ദിഷ്ട വ്യക്തിഒരു പ്രത്യേക സമയത്ത്, മാറ്റുക കൂലിഒരു നിശ്ചിത സമയത്തേക്ക് ഒരു പ്രത്യേക വിഭാഗം ആളുകൾ. SQL ടെർമിനോളജി ഉപയോഗിച്ച്, ഒരു അനലിറ്റിക്കൽ ആപ്ലിക്കേഷനിൽ നിന്നുള്ള ഒരു സാധാരണ ഡാറ്റാബേസ് അന്വേഷണത്തിൽ ഒരു ഗ്രൂപ്പ് ബൈ ക്ലോസും കോളുകളും അടങ്ങിയിരിക്കുന്നു. മൊത്തത്തിലുള്ള പ്രവർത്തനങ്ങൾ. ഈ കോഴ്‌സിൽ SQL-അധിഷ്ഠിത DBMS-കൾ നടപ്പിലാക്കുന്നതിൻ്റെ പ്രശ്‌നങ്ങൾ ഞങ്ങൾ സ്പർശിക്കുന്നില്ലെങ്കിലും പൊതുവായ പരിഗണനകൾഒരു ഗ്രൂപ്പ് ബൈ ക്ലോസ് ഉള്ള അന്വേഷണങ്ങൾ DBMS-ന് പൊതുവെ "ബുദ്ധിമുട്ടാണ്" എന്നത് വ്യക്തമായിരിക്കേണ്ടതാണ്, കാരണം ഒരു പട്ടിക ഗ്രൂപ്പുചെയ്യുന്നതിന് സാധാരണയായി ആവശ്യമാണ് ബാഹ്യ തരം.

അനലിറ്റിക്കൽ ആപ്ലിക്കേഷനുകൾക്കായി പ്രത്യേകം രൂപകൽപ്പന ചെയ്‌തിരിക്കുന്ന ഡാറ്റാബേസ് സിസ്റ്റങ്ങളിൽ, സംഗ്രഹിച്ച ഡാറ്റയുടെ (അതായത്, കോളുകളുടെ ഫലങ്ങൾ) വ്യക്തമായ അനാവശ്യ സംഭരണത്തിലൂടെയാണ് പ്രശ്നം സാധാരണയായി പരിഹരിക്കപ്പെടുന്നത്. മൊത്തത്തിലുള്ള പ്രവർത്തനങ്ങൾ). തീർച്ചയായും, വിശദമായ ഡാറ്റ മാറുമ്പോൾ സംഭരിച്ച മൊത്തം മൂല്യങ്ങളുടെ ചലനാത്മക ക്രമീകരണം ഇതിന് ആവശ്യമാണ്, എന്നാൽ അത്തരം പ്രത്യേക ഡാറ്റാബേസുകൾക്ക് ഇത് വളരെ ഭാരമുള്ളതല്ല, കാരണം അനലിറ്റിക്കൽ ഡാറ്റാബേസുകൾ താരതമ്യേന അപൂർവ്വമായി അപ്ഡേറ്റ് ചെയ്യപ്പെടുന്നു.

എന്നിരുന്നാലും, എല്ലാ എൻ്റർപ്രൈസസിനും ഒരേസമയം ജോലിക്കായി ഒരു പ്രവർത്തന ഡാറ്റാബേസ് നിലനിർത്താൻ കഴിയില്ല പതിവ് ആപ്ലിക്കേഷനുകൾ പ്രവർത്തന പ്രോസസ്സിംഗ്അക്കൗണ്ടിംഗ്, എച്ച്ആർ, മറ്റ് ആപ്ലിക്കേഷനുകൾ എന്നിവ പോലുള്ള ഇടപാടുകൾ (OLTP), ആപ്ലിക്കേഷനുകൾക്കായുള്ള ഒരു വിശകലന ഡാറ്റാബേസ് പ്രവർത്തനക്ഷമമായ അനലിറ്റിക്കൽ പ്രോസസ്സിംഗ് (OLAP). വിശദമായ പ്രവർത്തന ഡാറ്റാബേസുകളിൽ നിങ്ങൾ അനലിറ്റിക്കൽ ആപ്ലിക്കേഷനുകൾ പ്രവർത്തിപ്പിക്കേണ്ടതുണ്ട്, കൂടാതെ ഗ്രൂപ്പ് ബൈ ക്ലോസുകളും കോളുകളും ഉപയോഗിച്ച് നിരവധി സമയമെടുക്കുന്ന ചോദ്യങ്ങളോടെ ഈ ആപ്ലിക്കേഷനുകൾ DBMS-ലേക്ക് പ്രവേശിക്കുന്നു. മൊത്തത്തിലുള്ള പ്രവർത്തനങ്ങൾ.

SQL ഭാഷാ സ്റ്റാൻഡേർഡിൻ്റെ ഡെവലപ്പർമാർ ഒരേസമയം രണ്ട് പ്രശ്നങ്ങൾ പരിഹരിക്കാൻ ശ്രമിച്ചു: അനലിറ്റിക്കൽ ആപ്ലിക്കേഷനുകളിൽ ആവശ്യമായ ചോദ്യങ്ങളുടെ എണ്ണം കുറയ്ക്കുക, ആവശ്യമായ സംഗ്രഹ ഡാറ്റ നൽകുന്ന ചോദ്യങ്ങളുടെ GROUP-ൻ്റെ വില കുറയ്ക്കുക. ഈ പ്രഭാഷണത്തിൽ, നമ്മുടെ കാഴ്ചപ്പാടിൽ, ഏറ്റവും പ്രധാനപ്പെട്ട നിർമ്മാണങ്ങളെക്കുറിച്ച് ഞങ്ങൾ ചർച്ച ചെയ്യും SQL ഭാഷ, ഫലങ്ങളുടെ രൂപീകരണം, നടപ്പിലാക്കൽ, ഉപയോഗം എന്നിവ സുഗമമാക്കുന്നു വിശകലന ചോദ്യങ്ങൾ: വിഭാഗങ്ങൾ റോളപ്പ് പ്രകാരം ഗ്രൂപ്പ്ഒപ്പം ക്യൂബ് പ്രകാരം ഗ്രൂപ്പ്പുതിയതും മൊത്തത്തിലുള്ള പ്രവർത്തനംഗ്രൂപ്പിംഗ്, ഫലങ്ങൾ ശരിയായി വ്യാഖ്യാനിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു വിശകലന ചോദ്യങ്ങൾസാന്നിധ്യത്തിൽ നിർവചിക്കപ്പെടാത്ത മൂല്യങ്ങൾ.

പരമ്പരാഗതമായി, SQL-ന് ഒരിക്കലും രൂപപ്പെടുത്താനുള്ള കഴിവില്ലായിരുന്നു ആവർത്തന ചോദ്യങ്ങൾ, എവിടെ താഴെ ആവർത്തന ചോദ്യം(ലളിതമായി പറഞ്ഞാൽ) ഈ ചോദ്യം എക്സിക്യൂട്ട് ചെയ്യുമ്പോൾ ഏതെങ്കിലും വിധത്തിൽ മാറുന്ന ഒരു പട്ടികയിലേക്കുള്ള ഒരു ചോദ്യം ഞങ്ങൾ മനസ്സിലാക്കുന്നു. ഇത് അടിസ്ഥാന സെമാൻ്റിക്സിൽ ഉൾച്ചേർത്തതാണെന്ന് ഞാൻ നിങ്ങളെ ഓർമ്മിപ്പിക്കട്ടെ SQL പ്രസ്താവന: WHERE ക്ലോസ് എക്സിക്യൂട്ട് ചെയ്യുന്നതിനുമുമ്പ്, FROM ക്ലോസിൻ്റെ ഫലം പൂർണ്ണമായി വിലയിരുത്തിയിരിക്കണം.

എന്നിരുന്നാലും, ആപ്ലിക്കേഷൻ ഡവലപ്പർമാർ പലപ്പോഴും SQL ഭാഷയിൽ ചോദ്യങ്ങൾ രൂപപ്പെടുത്തുന്നതിനുള്ള പരമ്പരാഗത മാർഗങ്ങൾ പര്യാപ്തമല്ലാത്ത പ്രശ്നങ്ങൾ പരിഹരിക്കേണ്ടതുണ്ട്: ഉദാഹരണത്തിന്, നൽകിയിരിക്കുന്ന രണ്ട് ഭൂമിശാസ്ത്ര പോയിൻ്റുകൾക്കിടയിൽ ഒരു റൂട്ട് കണ്ടെത്തൽ, ഒരു നിശ്ചിത യൂണിറ്റ് കൂട്ടിച്ചേർക്കുന്നതിനുള്ള ഒരു പൊതു കൂട്ടം ഘടകങ്ങൾ നിർണ്ണയിക്കൽ തുടങ്ങിയവ. SQL-അധിഷ്ഠിത DBMS-കൾ നിർമ്മിക്കുന്ന കമ്പനികൾ പരിമിതമായ ആവർത്തന ഗുണങ്ങളുള്ള കുത്തക പരിഹാരങ്ങളിലൂടെ അത്തരം ആവശ്യങ്ങൾ തൃപ്തിപ്പെടുത്താൻ ശ്രമിച്ചു, എന്നാൽ SQL:1999 സ്റ്റാൻഡേർഡിൻ്റെ വരവ് വരെ, പൊതുവായ സ്റ്റാൻഡേർഡ് ടൂളുകളൊന്നും ഉണ്ടായിരുന്നില്ല.

ജനറേറ്റ് ചെയ്‌ത പട്ടികകൾക്കിടയിൽ കുറച്ച് മർദ്ദം ഉണ്ടെന്ന് ശ്രദ്ധിക്കേണ്ടതാണ്. എന്നിരുന്നാലും, വേണ്ടി മാത്രം രേഖീയ ആവർത്തനംനൽകിയിരിക്കുന്നു അധിക സവിശേഷതകൾകണക്കുകൂട്ടൽ ഓർഡർ നിയന്ത്രണം ആവർത്തിച്ച് നിർവചിച്ചിരിക്കുന്നത്സൃഷ്ടിച്ച പട്ടികയും സൈക്കിളുകളുടെ അഭാവത്തിൻ്റെ നിയന്ത്രണവും. സ്റ്റാൻഡേർഡ് വായിക്കുമ്പോൾ, അതിൻ്റെ രചയിതാക്കൾ തന്നെ ഇതുവരെ എല്ലാം പൂർണ്ണമായി തിരിച്ചറിഞ്ഞിട്ടില്ലെന്ന ധാരണ ചിലപ്പോൾ ഒരാൾക്ക് ലഭിക്കുന്നു എന്നത് ശ്രദ്ധിക്കേണ്ടതാണ്. സാധ്യമായ അനന്തരഫലങ്ങൾ, ഇത് അവതരിപ്പിച്ച ഘടനകളുടെ ഉപയോഗത്തിൽ നിന്ന് ഉണ്ടാകാം. സ്റ്റാൻഡേർഡിൻ്റെ ഭാവി പതിപ്പുകളിൽ ഈ നിർമ്മിതികളുടെ ഉപയോഗത്തിൽ വ്യക്തതകളും കൂടാതെ/അല്ലെങ്കിൽ നിയന്ത്രണങ്ങളും ഞങ്ങൾ പ്രതീക്ഷിക്കണമെന്ന് ഞാൻ കരുതുന്നു. ഇക്കാര്യത്തിൽ, ഈ പ്രഭാഷണത്തിൽ ഞങ്ങൾ സ്വയം പരിമിതപ്പെടുത്തുന്നു പൊതുവായ നിർവചനങ്ങൾ SQL ഭാഷയുടെയും ചർച്ചയുടെയും ആവർത്തന ഘടനകൾ ലളിതമായ കേസ് ആവർത്തന ചോദ്യം.

ഒരേ തരത്തിലുള്ള അന്വേഷണങ്ങൾ സംയോജിപ്പിക്കുന്നു

"ശക്തമായ വിൽപ്പനക്കാരൻ" അല്ലെങ്കിൽ "ദുർബലൻ" എന്ന് ലേബൽ ചെയ്ത വിൽപ്പനക്കാരുടെ എണ്ണം പ്രദർശിപ്പിക്കുക. ഒരു വിൽപ്പനക്കാരൻ ശക്തനാണെങ്കിൽ അയാൾ ശക്തനായി കണക്കാക്കപ്പെടുന്നു ശരാശരി ചെലവ്ട്രേഡുകൾ 500-ൽ കൂടുതൽ, ദുർബലമാണ് - 500-ൽ താഴെ(അഭ്യർത്ഥന ഷീറ്റ് 39 ൽ കാണിച്ചിരിക്കുന്നു , ഫലമായി - മേശ 51 ):

N_Seller പ്രകാരം ഗ്രൂപ്പ്

ശരാശരി ഉണ്ട് (വില)<500

N_Seller പ്രകാരം ഗ്രൂപ്പ്

ശരാശരി (ചെലവ്)>500;

മേശ 51. യൂണിയൻ ഓപ്പറേറ്ററുമായുള്ള അന്വേഷണത്തിൻ്റെ ഫലം

"ശക്തമായ വിൽപ്പനക്കാരൻ" അല്ലെങ്കിൽ "ദുർബലൻ" എന്ന് ലേബൽ ചെയ്ത വിൽപ്പനക്കാരുടെ എണ്ണം പ്രദർശിപ്പിക്കുക. ശരാശരി ഇടപാട് മൂല്യം 500-ൽ കൂടുതലുള്ള വിൽപ്പനക്കാരനെ ശക്തനായി കണക്കാക്കുന്നു, ദുർബലമായ വിൽപ്പനക്കാരൻ 500-ൽ താഴെയാണ്, പ്രവർത്തനമനുസരിച്ച് അടുക്കുക(അഭ്യർത്ഥന ഷീറ്റ് 40 ൽ കാണിച്ചിരിക്കുന്നു , ഫലമായി - മേശ 52 ):

ഇടപാടുകളിൽ നിന്നുള്ള പ്രവർത്തനമായി N_Seller, "ദുർബലമായ വിൽപ്പനക്കാരൻ" തിരഞ്ഞെടുക്കുക

N_Seller പ്രകാരം ഗ്രൂപ്പ്

ശരാശരി ഉണ്ട് (വില)<500

ഇടപാടുകളിൽ നിന്നുള്ള പ്രവർത്തനമായി UNION N_Seller, "ശക്തമായ വിൽപ്പനക്കാരൻ" തിരഞ്ഞെടുക്കുക

N_Seller പ്രകാരം ഗ്രൂപ്പ്

ശരാശരി (ചെലവ്)>500 ഉണ്ട്

പ്രവർത്തനം പ്രകാരം ഓർഡർ ചെയ്യുക;

മേശ 52. യൂണിയൻ ഉള്ള ഒരു അഭ്യർത്ഥനയുടെ ഫലം

റിലേഷണൽ ബീജഗണിതത്തിലെ കവലയ്ക്കും വ്യത്യാസത്തിനും അനുസൃതമായി, കവലയും ഓപ്പറേറ്റർ ഒഴികെയുള്ളവയും സമാനമായി പ്രവർത്തിക്കുന്നു. വേണ്ടി വിഷയ മേഖലവാങ്ങുന്നവരുടെയും വിൽപ്പനക്കാരുടെയും നഗരങ്ങളുടെ "വിൽപ്പന" ലിസ്റ്റുകൾ ഒരുപോലെ ആയിരിക്കണമെന്നില്ല, അതിനാൽ പട്ടികയിൽ കാണിച്ചിരിക്കുന്നതുപോലെ ഈ ലിസ്റ്റുകളിലെ വിവിധ പ്രശ്നങ്ങൾ നമുക്ക് പരിഹരിക്കാനാകും. 53.

മേശ 53. ഒരേ തരത്തിലുള്ള അന്വേഷണങ്ങൾക്കായി ജോയിൻ ഓപ്പറേറ്റർമാരെ ഉപയോഗിക്കുന്നു

ഇലയിലേക്ക്. 25 ഇവാനോവിൻ്റെ കീഴുദ്യോഗസ്ഥരെ തിരഞ്ഞ ഒരു അഭ്യർത്ഥനയുടെ ഒരു ഉദാഹരണം നൽകി. അവൻ്റെ അടുത്ത കീഴുദ്യോഗസ്ഥർ മാത്രമല്ല, കീഴുദ്യോഗസ്ഥരുടെ മുഴുവൻ ശ്രേണിയും എങ്ങനെ നിർമ്മിക്കാം എന്ന ചോദ്യം ഉയർന്നുവരുന്നു. വാസ്തവത്തിൽ, ഞങ്ങൾ ഇതേ ഷീറ്റ് ചോദ്യം പ്രയോഗിക്കേണ്ടതുണ്ട്. 25 അത് സ്വയം നിർവഹിക്കുന്നതിൻ്റെ ഫലത്തിലേക്ക്, പിന്നെയും, കീഴാളർ കൂടുതൽ കൂടുതൽ ആകുന്നതുവരെ താഴ്ന്ന നിലകൾഅധികാരശ്രേണി.

"നീളത്തിൽ" ഇവാനോവിൻ്റെ എല്ലാ കീഴുദ്യോഗസ്ഥരുടെയും ഒരു ശ്രേണി നിർമ്മിക്കുക(അഭ്യർത്ഥന ഷീറ്റ് 41 ൽ കാണിച്ചിരിക്കുന്നു , ഫലമായി - മേശ 54 ).

ആവർത്തന ചോദ്യങ്ങൾ തിരിച്ചറിയാൻ കഴിയും കീവേഡ്റിക്കേഴ്‌സീവ് ഉപയോഗിച്ച്. ആവർത്തിച്ച് വിളിക്കാൻ, ചോദ്യത്തിന് യഥാർത്ഥത്തിൽ ഒരു പേര് ഉണ്ടായിരിക്കണം (ഈ സാഹചര്യത്തിൽ - പ്രൊഡ്). അഭ്യർത്ഥനയിൽ UNION ഉപയോഗിച്ച് രണ്ട് ഭാഗങ്ങൾ അടങ്ങിയിരിക്കുന്നു. ആദ്യ ഭാഗത്ത് - മേലധികാരികൾ, രണ്ടാം ഭാഗത്ത് - അവരുടെ കീഴുദ്യോഗസ്ഥർ. ചോദ്യം ആദ്യത്തെ അടിമയെ കണ്ടെത്തുന്നു, പിന്നെ ആദ്യത്തെ അടിമയെ കണ്ടെത്തുന്നു. ഈ ചോദ്യങ്ങളെ ലോംഗ്-ലെംഗ്ത്ത് സെർച്ച് ക്വറികൾ എന്ന് വിളിക്കുന്നു.

ഷീറ്റ്. 41. ആവർത്തന അന്വേഷണം "നീളത്തിൽ"

(N, പേര് തിരഞ്ഞെടുക്കുക

വിൽപ്പനക്കാരിൽ നിന്ന്

എവിടെ പേര് = 'ഇവാനോവ്'

വിൽപ്പനക്കാരെ തിരഞ്ഞെടുക്കുക. N, Sellers.Name

വിൽപ്പനക്കാരിൽ നിന്ന്, വിൽപ്പന

Cont-ൽ നിന്ന് * തിരഞ്ഞെടുക്കുക;

മേശ 54. "നീളത്തിൽ" ഒരു ആവർത്തന അന്വേഷണത്തിൻ്റെ ഫലം

ഞങ്ങൾ ആദ്യം ഇവാനോവിൻ്റെ എല്ലാ കീഴുദ്യോഗസ്ഥരെയും, പിന്നെ ഇവാനോവിൻ്റെ കീഴുദ്യോഗസ്ഥരെയും മറ്റും ലിസ്റ്റ് ചെയ്യണമെങ്കിൽ, SEARCH BREADTH FIRST ഓപ്പറേറ്റർ ഉപയോഗിച്ച് ബ്രെഡ്ത്ത്-ഫസ്റ്റ് റിക്കേഴ്‌സീവ് അന്വേഷണങ്ങൾ ഉപയോഗിക്കേണ്ടതുണ്ട്. SET ഓപ്പറേറ്റർ ഉപയോഗിച്ച് ചോദ്യം ആവർത്തന നമ്പർ സജ്ജമാക്കുന്നു.

ഇവാനോവിൻ്റെ എല്ലാ കീഴുദ്യോഗസ്ഥരുടെയും "വിശാലതയിൽ" ഒരു ശ്രേണി നിർമ്മിക്കുക(അഭ്യർത്ഥന ഷീറ്റ് 42 ൽ കാണിച്ചിരിക്കുന്നു , ഫലമായി - മേശ 55 ).

ഷീറ്റ്. 42. ആവർത്തന വീതി-ആദ്യ ചോദ്യം

ആവർത്തിച്ചുള്ള ഉള്ളടക്കം (N, പേര്, N_Head) ആയി

(N, പേര് തിരഞ്ഞെടുക്കുക

വിൽപ്പനക്കാരിൽ നിന്ന്

എവിടെ പേര് = 'ഇവാനോവ്'

വിൽപ്പനക്കാരിൽ നിന്ന്, വിൽപ്പന

എവിടെ Cont.N = Sellers.N_Chief);

N_Chief, N, BYBIRST BREADTH തിരയുക

ഓർഡർ_കോളം സജ്ജമാക്കുക

Cont-ൽ നിന്ന് * തിരഞ്ഞെടുക്കുക

ഓർഡർ_കോളം പ്രകാരം ഓർഡർ ചെയ്യുക;

മേശ 55. "വിശാലത ആദ്യം" എന്ന ചോദ്യത്തിൻ്റെ ഫലം

ഒരു ആവർത്തന ചോദ്യം ഉപയോഗിച്ച്, ഒരു ലൂപ്പിംഗ് സാഹചര്യം സാധ്യമാണ്. ഇത് ഞങ്ങളുടെ ഉദാഹരണത്തിൽ ഇല്ലെങ്കിലും, ഒരു ടീം രണ്ട് പ്രോജക്റ്റുകളിൽ പ്രവർത്തിക്കുമ്പോൾ സാഹചര്യങ്ങളുണ്ടെന്ന് നമുക്ക് അനുമാനിക്കാം, ആദ്യ പ്രോജക്റ്റിലെ ഒരാൾ ബോസാണ്, രണ്ടാമത്തേത് ഒരു കീഴാളനാണ്, തിരിച്ചും, രണ്ടാമത്തെ വ്യക്തി. ആദ്യ പദ്ധതിയിൽ ഒരു കീഴാളനാണ്. രണ്ടാമത്തേതിൽ - ബോസ്. ഈ സാഹചര്യത്തിൽ, മുമ്പത്തെ ആവർത്തന ചോദ്യങ്ങൾ ലൂപ്പ് ചെയ്യും.

ലൂപ്പിംഗിൻ്റെ സാധ്യത കണക്കിലെടുത്ത് ഇവാനോവിൻ്റെ എല്ലാ കീഴുദ്യോഗസ്ഥരുടെയും ഒരു ശ്രേണി നിർമ്മിക്കുക(ഷീറ്റ് 43) .

ഷീറ്റ്. 43. ലൂപ്പിംഗ് കണക്കിലെടുത്ത് ആവർത്തന അന്വേഷണം

ആവർത്തിച്ചുള്ള Cont (N, പേര്) എന്ന നിലയിൽ

(N, പേര് തിരഞ്ഞെടുക്കുക

വിൽപ്പനക്കാരിൽ നിന്ന്

എവിടെ പേര് = 'ഇവാനോവ്'

വിൽപ്പനക്കാരെ തിരഞ്ഞെടുക്കുക. എൻ, വിൽപ്പനക്കാർ. പേര്

വിൽപ്പനക്കാരിൽ നിന്ന്, വിൽപ്പന

എവിടെ Cont.N = Sellers.N_Chief);

സൈക്കിൾമാർക്ക് "Y" ഡിഫോൾട്ട് "N" ആയി സജ്ജീകരിക്കുക

സൈക്കിൾപാത്ത് ഉപയോഗിക്കുന്നു

Cont-ൽ നിന്ന് * തിരഞ്ഞെടുക്കുക

D/Z 6. D/Z 4-ൽ നിന്നുള്ള ഉദാഹരണത്തിനായി, ഇനിപ്പറയുന്ന ചോദ്യങ്ങളുമായി വരിക:

  1. സ്റ്റേറ്റ്‌മെൻ്റുകൾ പ്രകാരം എവിടെ, ഉള്ളത്, ഓർഡർ എന്നിവ ഉപയോഗിച്ച് ഒരു മൊത്തത്തിലുള്ള ഫംഗ്‌ഷനെ വിലയിരുത്തുന്ന ഒരൊറ്റ പട്ടിക ചോദ്യം.
  2. അപരനാമങ്ങൾക്കു കീഴിലുള്ള ചോദ്യത്തിൽ ഒരു ടേബിൾ ഒന്നിലധികം തവണ ഉപയോഗിക്കേണ്ട ക്ലോസ് ഉപയോഗിച്ച് ഒന്നിലധികം ടേബിൾ ജോയിൻ ക്വറി.
  3. വലത്തോട്ടോ ഇടത്തോട്ടോ പൂർണ്ണമായി ചേരുന്നതിലൂടെയോ അന്വേഷണം.
  4. എവിടെ, ക്ലോസുകൾ ഉള്ളതിൽ രണ്ട് ഉപചോദ്യങ്ങളുള്ള ചോദ്യം
  5. എല്ലാം, ഏതെങ്കിലും, അല്ലെങ്കിൽ നിലവിലുള്ളത് ഉപയോഗിച്ച് ഒരു സബ്ക്വറി ഉപയോഗിച്ച് അന്വേഷണം.
  6. രണ്ട് ടേബിളുകളുടെ യൂണിയൻ ഉള്ള ഒരു നെസ്റ്റഡ് അന്വേഷണം (ജോയ്‌നിംഗ് ഇനങ്ങളിൽ ഒന്ന്), പരോക്ഷമായി മൂന്നിലൊന്ന് ബന്ധിപ്പിച്ചിരിക്കുന്നു.
  7. ഒരേ തരത്തിലുള്ള അന്വേഷണങ്ങൾ സംയോജിപ്പിക്കുന്നു.
  8. ആവർത്തിച്ചുള്ള ചോദ്യം.

സ്വയം പരിശോധനാ ചോദ്യങ്ങൾ:

1. ഓപ്പറേറ്റർമാരുടെ ഗ്രൂപ്പ് ബൈ, ഗ്രൂപ്പ് ബൈ റോളപ്പ്, ഗ്രൂപ്പ് ബൈ റോളപ്പ് ക്യൂബ്, ഗ്രൂപ്പിംഗ്, ഓർഗനൈസർ ബൈ, പാർട്ടീഷൻ എന്നിവ തമ്മിലുള്ള വ്യത്യാസം എന്താണ്?

2. എവിടെ എന്നതും പ്രസ്താവനകൾ ഉള്ളതും തമ്മിലുള്ള വ്യത്യാസം എന്താണ്?

3. പൊരുത്തത്തിൽ എന്ത് അന്വേഷണമാണ് ചേരുന്നത്? എവിടെ ഓപ്പറേറ്റർ?

4. ഏതുതരം പ്രവർത്തനം റിലേഷണൽ ബീജഗണിതംഎവിടെ പ്രസ്താവനയുമായി പൊരുത്തപ്പെടുന്നു?

5. ജോയിൻ ഓപ്പറേറ്റർ ഏത് റിലേഷണൽ ബീജഗണിത പ്രവർത്തനവുമായി പൊരുത്തപ്പെടുന്നു?

ഈ ഫലങ്ങൾ കൂടുതൽ ഉപയോഗപ്രദമാണെന്ന് തോന്നുന്നു. ഇപ്പോൾ ReachableFrom ടേബിളിൽ, ഡെസ്റ്റിനേഷൻ ഫീൽഡിൽ ഒരേ ടേബിളിൻ്റെ ഉറവിട ഫീൽഡിൽ സ്ഥിതി ചെയ്യുന്ന ഏത് നഗരത്തിൽ നിന്നും എത്തിച്ചേരാവുന്ന എല്ലാ നഗരങ്ങളും അടങ്ങിയിരിക്കുന്നു, ഒന്നിൽ കൂടുതൽ സ്റ്റോപ്പ് ഓവർ ഉണ്ടാക്കുന്നില്ല. തുടർന്ന്, അടുത്ത പാസിൽ, ആവർത്തനം രണ്ട് ഇൻ്റർമീഡിയറ്റ് സ്റ്റോപ്പുകളുള്ള റൂട്ടുകൾ പ്രോസസ്സ് ചെയ്യും, ഒപ്പം എത്തിച്ചേരാവുന്ന എല്ലാ നഗരങ്ങളും കണ്ടെത്തുന്നത് വരെ അത് തുടരും.

ആവർത്തനം പൂർത്തിയായ ശേഷം, മൂന്നാമത്തേതും അവസാനത്തേതുമായ SELECT പ്രസ്താവന (ആവർത്തനത്തിൽ ഉൾപ്പെട്ടിട്ടില്ല) പോർട്ട്‌ലാൻഡിൽ നിന്ന് എത്തിച്ചേരാൻ കഴിയുന്ന നഗരങ്ങളിൽ നിന്ന് മാത്രം എത്തിച്ചേരാവുന്നതിൽ നിന്ന് തിരഞ്ഞെടുക്കുന്നു. ഈ ഉദാഹരണത്തിൽ, നിങ്ങൾക്ക് മറ്റ് ആറ് നഗരങ്ങളിലേക്കും വളരെ ചെറിയ എണ്ണം ഇൻ്റർമീഡിയറ്റ് സ്റ്റോപ്പുകളിലേക്കും പോകാം. അതിനാൽ, നിങ്ങൾ ഒരു സ്പ്രിംഗ് ഉള്ള ഒരു സ്റ്റിൽറ്റിൽ കയറുന്നതുപോലെ തിരക്കുകൂട്ടേണ്ടതില്ല.

റിക്കേഴ്‌സീവ് ക്വറി കോഡിലേക്ക് നിങ്ങൾ സൂക്ഷ്മമായി നോക്കുകയാണെങ്കിൽ, ഏഴ് വ്യത്യസ്ത ചോദ്യങ്ങളേക്കാൾ ലളിതമായി ഇത് തോന്നുന്നില്ലെന്ന് നിങ്ങൾ കാണും. എന്നിരുന്നാലും, ഈ അഭ്യർത്ഥനയ്ക്ക് രണ്ട് ഗുണങ്ങളുണ്ട്:

  • അതിൻ്റെ വിക്ഷേപണത്തിനുശേഷം, ബാഹ്യ ഇടപെടൽ ഇനി ആവശ്യമില്ല;
  • അത് വേഗത്തിൽ പ്രവർത്തിക്കുന്നു.

നിങ്ങൾക്ക് കഴിയുമെങ്കിൽ, റൂട്ട് മാപ്പിൽ കൂടുതൽ നഗരങ്ങളുള്ള ഒരു യഥാർത്ഥ എയർലൈൻ സങ്കൽപ്പിക്കുക. കൂടാതെ കൂടുതൽ സാധ്യമായ സ്ഥലങ്ങൾനിയമനങ്ങൾ, ആ കൂടുതൽ പ്രയോജനംആവർത്തന രീതിയിൽ നിന്ന്.

എന്താണ് ഒരു ചോദ്യം ആവർത്തനാത്മകമാക്കുന്നത്? ഞങ്ങൾ ReachableFrom പട്ടികയെ അതിൻ്റെ അടിസ്ഥാനത്തിൽ നിർവചിക്കുന്നു. നിർവചനത്തിൻ്റെ ആവർത്തിച്ചുള്ള ഭാഗം, UNION-ന് തൊട്ടുപിന്നാലെ സ്ഥിതി ചെയ്യുന്ന രണ്ടാമത്തെ SELECT പ്രസ്താവനയാണ്. നിന്ന് എത്തിച്ചേരാംആവർത്തനം സംഭവിക്കുമ്പോൾ ഡാറ്റ നിറച്ച ഒരു താൽക്കാലിക പട്ടികയാണ്. സാധ്യമായ എല്ലാ ലക്ഷ്യസ്ഥാനങ്ങളും എത്തിച്ചേരുന്നത് വരെ ഈ പൂരിപ്പിക്കൽ തുടരും. ഈ പട്ടികയിൽ തനിപ്പകർപ്പ് വരികളൊന്നും ഉണ്ടാകില്ല, കാരണം UNION ഓപ്പറേറ്റർ അവയെ കടത്തിവിടില്ല. ആവർത്തനം പൂർത്തിയാകുമ്പോൾ, റീച്ചബിൾ ഫ്രം ടേബിളിൽ ഏത് ആരംഭ നഗരത്തിൽ നിന്നും എത്തിച്ചേരാനാകുന്ന എല്ലാ നഗരങ്ങളും അടങ്ങിയിരിക്കും. മൂന്നാമത്തേതും അവസാനത്തേതുമായ SELECT പ്രസ്‌താവന പോർട്ട്‌ലാൻഡിൽ നിന്ന് നിങ്ങൾക്ക് എത്തിച്ചേരാൻ കഴിയുന്ന നഗരങ്ങൾ മാത്രം നൽകുന്നു. അതിനാൽ ഞങ്ങൾ നിങ്ങൾക്ക് സന്തോഷകരമായ ഒരു യാത്ര നേരുന്നു.

നിങ്ങൾക്ക് ഒരു ആവർത്തന അന്വേഷണം മറ്റെവിടെ ഉപയോഗിക്കാനാകും?

ഒരു ട്രീ ഘടനയായി പ്രതിനിധീകരിക്കാൻ കഴിയുന്ന ഏത് പ്രശ്‌നവും ഒരു ആവർത്തന ചോദ്യം ഉപയോഗിച്ച് പരിഹരിക്കാനാകും. വ്യവസായത്തിൽ അത്തരം അന്വേഷണങ്ങൾ എങ്ങനെ ഉപയോഗിക്കപ്പെടുന്നു എന്നതിൻ്റെ ഒരു മികച്ച ഉദാഹരണമാണ് മെറ്റീരിയൽ പ്രോസസ്സിംഗ് (അസംസ്കൃത വസ്തുക്കളെ അന്തിമ ഉൽപ്പന്നമാക്കി മാറ്റുന്ന പ്രക്രിയ). നിങ്ങളുടെ കമ്പനി ഒരു പുതിയ ഗ്യാസോലിൻ-ഇലക്ട്രിക് ഹൈബ്രിഡ് കാർ പുറത്തിറക്കുകയാണെന്ന് പറയാം. അത്തരം ഒരു യന്ത്രം ഘടകങ്ങളിൽ നിന്ന് (എഞ്ചിൻ, ബാറ്ററികൾ മുതലായവ) കൂട്ടിച്ചേർക്കുന്നു, അതാകട്ടെ, ചെറിയ ഉപവിഭാഗങ്ങൾ (ക്രാങ്ക്ഷാഫ്റ്റ്, ഇലക്ട്രോഡുകൾ മുതലായവ) ഉൾക്കൊള്ളുന്നു, അവ - അതിലും ചെറിയ ഘടകങ്ങളിൽ നിന്നും.

ഈ എല്ലാ ഘടകങ്ങളെയും കുറിച്ചുള്ള ഡാറ്റ സംഭരിച്ചിരിക്കുന്നു റിലേഷണൽ ഡാറ്റാബേസ്വളരെ ബുദ്ധിമുട്ടാണ് - തീർച്ചയായും, അത് ആവർത്തനം ഉപയോഗിക്കുന്നില്ലെങ്കിൽ. ഒരു മുഴുവൻ മെഷീനിൽ നിന്ന് ആരംഭിച്ച്, ഏത് വിധത്തിലും ഏറ്റവും ചെറിയ ഭാഗത്തേക്ക് എത്താൻ ആവർത്തനം സാധ്യമാക്കുന്നു. ടെർമിനൽ കൈവശം വച്ചിരിക്കുന്ന മൗണ്ടിംഗ് സ്ക്രൂയെ കുറിച്ചുള്ള ഡാറ്റ കണ്ടെത്താൻ ആഗ്രഹിക്കുന്നു നെഗറ്റീവ് ഇലക്ട്രോഡ്സഹായ ബാറ്ററി? ഇത് സാധ്യമാണ് - കൂടുതൽ സമയ നിക്ഷേപം കൂടാതെ. ഇവ കൈകാര്യം ചെയ്യുക SQL ടാസ്ക്കുകൾറിക്കേഴ്‌സീവ് ഘടന ഉപയോഗിച്ച് (ആവർത്തന ഓപ്പറേറ്റർ) കഴിയും.

കൂടാതെ, "എന്താണെങ്കിൽ" വിശകലനത്തിൽ ആവർത്തനം തികച്ചും സ്വാഭാവികമാണ്. ഉദാഹരണത്തിന്, പോർട്ട്‌ലാൻഡിൽ നിന്ന് ഷാർലറ്റിലേക്കുള്ള പറക്കൽ നിർത്താൻ വന്നവർ എയർലൈൻസ് തീരുമാനിച്ചാൽ എന്ത് സംഭവിക്കും? പോർട്ട്‌ലാൻഡിൽ നിന്ന് നിലവിൽ ആക്‌സസ് ചെയ്യാവുന്ന നഗരങ്ങളിലേക്കുള്ള ഫ്ലൈറ്റുകളെ ഇത് എങ്ങനെ ബാധിക്കും? ഒരു ആവർത്തന ചോദ്യം ഈ ചോദ്യങ്ങൾക്ക് ഉടനടി ഉത്തരം നൽകും.