{"id":4094,"date":"2024-01-11T18:00:00","date_gmt":"2024-01-11T17:00:00","guid":{"rendered":"https:\/\/www.skillup.cloud\/?p=4094"},"modified":"2024-02-11T16:22:58","modified_gmt":"2024-02-11T15:22:58","slug":"cte-ricorsive-leleganza-della-semplicita-in-sql-2","status":"publish","type":"post","link":"https:\/\/www.skillup.cloud\/it\/cte-ricorsive-leleganza-della-semplicita-in-sql-2\/","title":{"rendered":"CTE Ricorsive: L\u2019Eleganza della Semplicit\u00e0 in SQL \u2013 2"},"content":{"rendered":"\n<p>Le Common Table Expressions (CTE) in SQL su IBM iSeries (AS\/400) costituiscono uno strumento efficace e versatile per l&#8217;elaborazione di query temporanee e riutilizzabili. Esse contribuiscono a semplificare e aumentare la chiarezza di query SQL complesse, rendendole pi\u00f9 gestibili e di pi\u00f9 facile comprensione.<\/p>\n\n\n\n<p>Di seguito gli articoli della serie CTE (incluso questo corrente):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <a href=\"https:\/\/www.skillup.cloud\/it\/iseries-sql-cte-common-table-expressions-definizioni-e-utilizzo\/\" target=\"_blank\" rel=\"noreferrer noopener\">iSeries Sql &#8211; CTE Common Table Expressions &#8211; definizioni e utilizzo<\/a> <\/span><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <a href=\"https:\/\/www.skillup.cloud\/it\/cte-ricorsive-leleganza-della-semplicita-in-sql-1\/\" target=\"_blank\" rel=\"noreferrer noopener\">CTE Ricorsive: L&#8217;Eleganza della Semplicit\u00e0 in SQL &#8211; 1<\/a> <\/span><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <a href=\"https:\/\/www.skillup.cloud\/it\/cte-ricorsive-leleganza-della-semplicita-in-sql-2\/\" target=\"_blank\" rel=\"noreferrer noopener\">CTE Ricorsive: L&#8217;Eleganza della Semplicit\u00e0 in SQL &#8211; 2<\/a> <\/span><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <a href=\"https:\/\/www.skillup.cloud\/it\/cte-ricorsive-leleganza-della-semplicita-in-sql-3\/\" target=\"_blank\" rel=\"noreferrer noopener\">CTE Ricorsive: L&#8217;Eleganza della Semplicit\u00e0 in SQL &#8211; 3<\/a><\/span><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <a href=\"https:\/\/www.skillup.cloud\/it\/recursive-cte-come-concatenare-i-risultati-su-ununica-riga\/\" target=\"_blank\" rel=\"noreferrer noopener\">Recursive CTE come concatenare i risultati su un\u2019unica riga<\/a> <\/span><\/li>\n<\/ul>\n\n\n\n<p>In particolare le Common Table Expressions (CTE)&nbsp;<strong>Ricorsive<\/strong>&nbsp;sono un potente strumento in SQL che permette di&nbsp;<strong>eseguire operazioni che, in assenza di questa funzionalit\u00e0, richiederebbero lo sviluppo di programmi specifici o l\u2019utilizzo di cicli complessi<\/strong>.<\/p>\n\n\n\n<p>Queste CTE sono particolarmente utili per lavorare con dati gerarchici, come alberi o strutture ad albero, e per eseguire calcoli iterativi o ricorsivi.<\/p>\n\n\n\n<p>In questo articolo vedremo un esempio significativo in dettaglio relativo alla &#8220;Generazione di un elenco di date&#8221; (entro un range di date).<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>CTE Ricorsiva per Generare elenco Date<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Descrizione Contesto e Obiettivo<\/strong><\/p>\n\n\n\n<p>Questa query \u00e8 progettata per la generazione di un elenco di date, entro un range predefinito, associando a ogni data con il nome del giorno della settimana corrispondente e il progressivo nel range. Se il range di date \u00e8 costituito dal 1 gennaio al 31 dicembre  di un anno vengono generate le date dell&#8217;intero anno.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Query<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">WITH \n   DayNames (DayNumber, DayName) AS (\n       VALUES (1, 'Domenica'),  (2, 'Luned\u00ec'),  (3, 'Marted\u00ec'), \n              (4, 'Mercoled\u00ec'), (5, 'Gioved\u00ec'), (6, 'Venerd\u00ec'), \n              (7, 'Sabato')\n       )\n , RangeDate (DataFrom, DataTo) AS (\n       VALUES (CAST('2024-01-01' AS DATE), CAST('2024-12-31' AS DATE))\n       )\n , DateLog (Data, Giorno, Progr) AS (\n       SELECT (SELECT DataFrom From RangeDate) AS Data -- Data di inizio\n            , (SELECT DayName FROM DayNames WHERE DayNumber =\n                      (DAYOFWEEK((SELECT DataFrom From RangeDate)))) AS Giorno\n            , 1 AS Progr\n         FROM SYSIBM.SYSDUMMY1\n        UNION ALL\n       SELECT Data  + 1 DAYS AS Data\n            , (SELECT DayName FROM DayNames WHERE DayNumber =\n                      (DAYOFWEEK(Data + 1 DAYS))) AS Giorno\n            , 1 + Progr AS Progr\n         FROM DateLog\n        WHERE Data &lt; (SELECT DataTo From RangeDate) -- Data di fine\n       )\nSELECT * FROM DateLog;\n<\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Risultato<\/strong><\/p>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<figure class=\"wp-block-table\"><table><tbody><tr><td>DATA<\/td><td>GIORNO<\/td><td>PROGR<\/td><\/tr><tr><td>2024-01-01<\/td><td>Luned\u00ec<\/td><td>1<\/td><\/tr><tr><td>2024-01-02<\/td><td>Marted\u00ec<\/td><td>2<\/td><\/tr><tr><td>2024-01-03<\/td><td>Mercoled\u00ec<\/td><td>3<\/td><\/tr><tr><td>2024-01-04<\/td><td>Gioved\u00ec<\/td><td>4<\/td><\/tr><tr><td>2024-01-05<\/td><td>Venerd\u00ec<\/td><td>5<\/td><\/tr><tr><td>2024-01-06<\/td><td>Sabato<\/td><td>6<\/td><\/tr><tr><td>2024-01-07<\/td><td>Domenica<\/td><td>7<\/td><\/tr><tr><td>2024-01-08<\/td><td>Luned\u00ec<\/td><td>8<\/td><\/tr><tr><td>2024-01-09<\/td><td>Marted\u00ec<\/td><td>9<\/td><\/tr><tr><td>2024-01-10<\/td><td>Mercoled\u00ec<\/td><td>10<\/td><\/tr><tr><td>2024-01-11<\/td><td>Gioved\u00ec<\/td><td>11<\/td><\/tr><tr><td>2024-01-12<\/td><td>Venerd\u00ec<\/td><td>12<\/td><\/tr><tr><td>2024-01-13<\/td><td>Sabato<\/td><td>13<\/td><\/tr><tr><td>2024-01-14<\/td><td>Domenica<\/td><td>14<\/td><\/tr><tr><td>2024-01-15<\/td><td>Luned\u00ec<\/td><td>15<\/td><\/tr><tr><td>2024-01-16<\/td><td>Marted\u00ec<\/td><td>16<\/td><\/tr><tr><td>2024-01-17<\/td><td>Mercoled\u00ec<\/td><td>17<\/td><\/tr><tr><td>2024-01-18<\/td><td>Gioved\u00ec<\/td><td>18<\/td><\/tr><tr><td>2024-01-19<\/td><td>Venerd\u00ec<\/td><td>19<\/td><\/tr><tr><td>2024-01-20<\/td><td>Sabato<\/td><td>20<\/td><\/tr><tr><td>2024-01-21<\/td><td>Domenica<\/td><td>21<\/td><\/tr><tr><td>2024-01-22<\/td><td>Luned\u00ec<\/td><td>22<\/td><\/tr><tr><td>2024-01-23<\/td><td>Marted\u00ec<\/td><td>23<\/td><\/tr><tr><td>2024-01-24<\/td><td>Mercoled\u00ec<\/td><td>24<\/td><\/tr><tr><td>2024-01-25<\/td><td>Gioved\u00ec<\/td><td>25<\/td><\/tr><tr><td>2024-01-26<\/td><td>Venerd\u00ec<\/td><td>26<\/td><\/tr><tr><td>2024-01-27<\/td><td>Sabato<\/td><td>27<\/td><\/tr><tr><td>2024-01-28<\/td><td>Domenica<\/td><td>28<\/td><\/tr><tr><td>2024-01-29<\/td><td>Luned\u00ec<\/td><td>29<\/td><\/tr><tr><td>2024-01-30<\/td><td>Marted\u00ec<\/td><td>30<\/td><\/tr><tr><td>2024-01-31<\/td><td>Mercoled\u00ec<\/td><td>31<\/td><\/tr><tr><td>2024-02-01<\/td><td>Gioved\u00ec<\/td><td>32<\/td><\/tr><tr><td>2024-02-02<\/td><td>Venerd\u00ec<\/td><td>33<\/td><\/tr><tr><td>&#8230;.-..-..<\/td><td>&#8230;&#8230;.<\/td><td>..<\/td><\/tr><tr><td>&#8230;.-..-..<\/td><td>&#8230;&#8230;.<\/td><td>..<\/td><\/tr><tr><td>2024-12-22<\/td><td>Domenica<\/td><td>357<\/td><\/tr><tr><td>2024-12-23<\/td><td>Luned\u00ec<\/td><td>358<\/td><\/tr><tr><td>2024-12-24<\/td><td>Marted\u00ec<\/td><td>359<\/td><\/tr><tr><td>2024-12-25<\/td><td>Mercoled\u00ec<\/td><td>360<\/td><\/tr><tr><td>2024-12-26<\/td><td>Gioved\u00ec<\/td><td>361<\/td><\/tr><tr><td>2024-12-27<\/td><td>Venerd\u00ec<\/td><td>362<\/td><\/tr><tr><td>2024-12-28<\/td><td>Sabato<\/td><td>363<\/td><\/tr><tr><td>2024-12-29<\/td><td>Domenica<\/td><td>364<\/td><\/tr><tr><td>2024-12-30<\/td><td>Luned\u00ec<\/td><td>365<\/td><\/tr><tr><td>2024-12-31<\/td><td>Marted\u00ec<\/td><td>366<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column\"><\/div>\n<\/div>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Descrizione dettagliata della query<\/strong><\/p>\n\n\n\n<p>La query \u00e8 composta da tre CTE principali<\/p>\n\n\n\n<p><strong>CTE DayNames<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Questa CTE crea una semplice tabella di corrispondenza tra i numeri dei giorni della settimana (1-7) e i loro nomi (da &#8220;Domenica&#8221; a &#8220;Sabato&#8221;).<\/li>\n<\/ul>\n\n\n\n<p><strong>CTE RangeDate<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Questa CTE definisce l&#8217;intervallo di date che si vuole generare, in questo caso, dall&#8217;1 gennaio 2024 (DataFrom) al 31 dicembre 2024 (DataTo).<\/li>\n<\/ul>\n\n\n\n<p><strong>CTE Ricorsiva DateLog<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Questa CTE \u00e8 il cuore della query. Utilizza la ricorsione per generare un elenco di date, iniziando dal 1 gennaio 2024 e terminando il 31 dicembre 2024.<br>&nbsp;<\/li>\n\n\n\n<li>Il primo elemento della CTE (<strong>membro ancoraggio<\/strong>) stabilisce il punto di partenza: la data iniziale (1 gennaio 2024), il nome del giorno corrispondente ottenuto tramite una subquery con la CTE <strong>DayNames<\/strong>, e un contatore progressivo (inizializzato a 1).<br>&nbsp;<\/li>\n\n\n\n<li>Il secondo elemento (<strong>membro ricorsivo<\/strong>) aggiunge un giorno alla data corrente ad ogni iterazione, determina il nome del giorno per la nuova data (ancora attraverso una subquery con <strong>DayNames<\/strong>), e incrementa il contatore progressivo. Questo processo continua fino a quando non viene raggiunta la data finale, il 31 dicembre 2024.<\/li>\n<\/ul>\n\n\n\n<p><strong>La Query Finale<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La query finale semplicemente seleziona tutte le righe dalla CTE <strong>DateLog<\/strong>. Questo elenco include ogni giorno del 2024, con il nome del giorno della settimana corrispondente e un contatore progressivo che rappresenta il numero di giorni dall&#8217;inizio dell&#8217;anno.<\/li>\n<\/ul>\n\n\n\n<p><strong>Punti Chiave e Considerazioni<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Utilizzo di CTE Ricorsive<\/strong>: La CTE <strong>DateLog<\/strong> \u00e8 un esempio classico di utilizzo delle CTE ricorsive per generare un elenco sequenziale di valori &#8211; in questo caso, un calendario per un anno.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Subquery con DayNames<\/strong>: In entrambi i membri della CTE <strong>DateLog<\/strong>, vi \u00e8 una subquery che si collega alla CTE <strong>DayNames<\/strong> per ottenere il nome del giorno della settimana. Questo mostra come le CTE possono essere interconnesse per eseguire calcoli complessi in modo efficiente.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Limitazione della Ricorsione<\/strong>: La clausola <strong>WHERE<\/strong> nel membro ricorsivo della CTE <strong>DateLog<\/strong> assicura che la ricorsione si fermi alla fine dell&#8217;anno 2024, prevenendo un ciclo infinito.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Performance e Limitazioni<\/strong>: Le CTE ricorsive possono essere impegnative in termini di prestazioni, specialmente per grandi intervalli di date. Inoltre, DB2 ha un limite sul numero di iterazioni ricorsive consentite in una CTE, quindi \u00e8 importante assicurarsi che la query non superi questo limite. In alcune configurazioni di DB2, questo limite \u00e8 impostato a 100 per impostazione predefinita, ma pu\u00f2 essere aumentato (ad esempio, fino a 1000 o pi\u00f9) se necessario.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Le Common Table Expressions (CTE) in SQL su IBM iSeries (AS\/400) costituiscono uno strumento efficace e versatile per l&#8217;elaborazione di query temporanee e riutilizzabili. Esse contribuiscono a semplificare e aumentare la chiarezza di query SQL complesse, rendendole pi\u00f9 gestibili e&#8230;<\/p>\n","protected":false},"author":3,"featured_media":4096,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[14,15,17],"tags":[46,124,128],"class_list":["post-4094","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-as400-architettura","category-gestire-as400-con-sql","category-piu-in-profondita","tag-sql","tag-cte-common-table-expression","tag-cte-ricorsive"],"_links":{"self":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4094","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/comments?post=4094"}],"version-history":[{"count":6,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4094\/revisions"}],"predecessor-version":[{"id":4378,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4094\/revisions\/4378"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media\/4096"}],"wp:attachment":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media?parent=4094"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/categories?post=4094"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/tags?post=4094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}