{"id":4079,"date":"2024-01-10T20:00:00","date_gmt":"2024-01-10T19:00:00","guid":{"rendered":"https:\/\/www.skillup.cloud\/?p=4079"},"modified":"2024-02-11T16:22:44","modified_gmt":"2024-02-11T15:22:44","slug":"cte-ricorsive-leleganza-della-semplicita-in-sql-1","status":"publish","type":"post","link":"https:\/\/www.skillup.cloud\/it\/cte-ricorsive-leleganza-della-semplicita-in-sql-1\/","title":{"rendered":"CTE Ricorsive: L&#8217;Eleganza della Semplicit\u00e0 in SQL &#8211; 1"},"content":{"rendered":"\n<p>Le Common Table Expressions (CTE) in SQL su IBM iSeries (AS\/400) rappresentano uno strumento potente e flessibile per creare query temporanee e riutilizzabili, semplificando e migliorando la leggibilit\u00e0 delle query SQL complesse..<\/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><\/p>\n\n\n\n<p>In particolare le Common Table Expressions (CTE) <strong>Ricorsive<\/strong> sono un potente strumento in SQL che permette di <strong>eseguire operazioni che, in assenza di questa funzionalit\u00e0, richiederebbero lo sviluppo di programmi specifici o l&#8217;utilizzo 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;Navigazione in strutture gerarchiche&#8221;<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>Assegnazione livello gerarchico con CTE Ricorsive<\/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 visualizzare la struttura organizzativa di un&#8217;azienda in una forma gerarchica. Pu\u00f2 essere utilizzata per comprendere le relazioni di report tra dipendenti e manager e per identificare la profondit\u00e0 della gerarchia organizzativa.<\/p>\n\n\n\n<p>Mentre la tabella originale potrebbe contenere altre informazioni pertinenti, per lo scopo di questa query, l\u2019attenzione \u00e8 focalizzata esclusivamente su identificativo dipendente (<strong>ID<\/strong>), Nome dipendente (<strong>Nome<\/strong>) e identific&lt;tivo Manager (<strong>IdManager<\/strong>).<\/p>\n\n\n\n<p>L\u2019obiettivo principale \u00e8 generare un elenco in cui ad ogni dipendente (ID e Nome) \u00e8 associato il livello gerarchico da 0 ad n, dove 0 rappresenta il top Manager o Azienda, 1 i dipendenti che dipendono dal top Manager, e cos\u00ec via.<\/p>\n\n\n\n<p>Supponiamo di avere un archivio che rappresenta la seguente struttura gerarchica (dove il top Manager \u00e8 I011):<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/www.skillup.cloud\/wp-content\/uploads\/2024\/01\/employee_manager.png\" alt=\"\" style=\"width:642px;height:auto\"\/><\/figure><\/div>\n\n\n<p>il contenuto dell&#8217;archivio employee:<\/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>ID<\/td><td>NOME<\/td><td>IDMANAGER<\/td><\/tr><tr><td>I011<\/td><td>Employee_011<\/td><td><\/td><\/tr><tr><td>I021<\/td><td>Employee_021<\/td><td>I011<\/td><\/tr><tr><td>I022<\/td><td>Employee_022<\/td><td>I011<\/td><\/tr><tr><td>I023<\/td><td>Employee_023<\/td><td>I011<\/td><\/tr><tr><td>I031<\/td><td>Employee_031<\/td><td>I022<\/td><\/tr><tr><td>I032<\/td><td>Employee_032<\/td><td>I022<\/td><\/tr><tr><td>I041<\/td><td>Employee_041<\/td><td>I031<\/td><\/tr><tr><td>I042<\/td><td>Employee_042<\/td><td>I031<\/td><\/tr><tr><td>I043<\/td><td>Employee_043<\/td><td>I031<\/td><\/tr><tr><td>I045<\/td><td>Employee_045<\/td><td>I032<\/td><\/tr><tr><td>I046<\/td><td>Employee_046<\/td><td>I032<\/td><\/tr><tr><td>I047<\/td><td>Employee_047<\/td><td>I032<\/td><\/tr><tr><td>I051<\/td><td>Employee_051<\/td><td>I042<\/td><\/tr><tr><td>I052<\/td><td>Employee_052<\/td><td>I046<\/td><\/tr><tr><td>I061<\/td><td>Employee_061<\/td><td>I051<\/td><\/tr><tr><td>I062<\/td><td>Employee_062<\/td><td>I051<\/td><\/tr><tr><td>I063<\/td><td>Employee_063<\/td><td>I051<\/td><\/tr><tr><td>I064<\/td><td>Employee_064<\/td><td>I052<\/td><\/tr><tr><td>I065<\/td><td>Employee_065<\/td><td>I052<\/td><\/tr><tr><td>I066<\/td><td>Employee_066<\/td><td>I052<\/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>Query<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">WITH -- starting data\n     employee (ID, Nome, IdManager) AS (\n         VALUES  ('I011', 'Employee_011',  NULL) , ('I021', 'Employee_021', 'I011'),\n                 ('I022', 'Employee_022', 'I011'), ('I023', 'Employee_023', 'I011'),\n                 ('I031', 'Employee_031', 'I022'), ('I032', 'Employee_032', 'I022')\n,\n                 ('I041', 'Employee_041', 'I031'), ('I042', 'Employee_042', 'I031'),\n                 ('I043', 'Employee_043', 'I031'), ('I045', 'Employee_045', 'I032'),\n                 ('I046', 'Employee_046', 'I032'), ('I047', 'Employee_047', 'I032')\n,\n                 ('I051', 'Employee_051', 'I042'), ('I052', 'Employee_052', 'I046'),\n                 ('I061', 'Employee_061', 'I051')\n, ('I062', 'Employee_062', 'I051'),\n                 ('I063', 'Employee_063', 'I051'), ('I064', 'Employee_064', 'I052')\n               , ('I065', 'Employee_065', 'I052'), ('I066', 'Employee_066', 'I052'))\n  ,  hierarchy (ID, Nome, Livello) AS (\n         SELECT ID, Nome\n              , 0 AS Livello\n           FROM employee\n          WHERE IdManager IS NULL -- Punto di partenza: manager di livello pi\u00f9 alto\n        UNION ALL\n         SELECT e.ID, e.Nome, h.Livello + 1\n           FROM employee e\n          INNER JOIN hierarchy h ON e.IDManager = h.ID\n          )\nSELECT * FROM hierarchy;\n<\/pre>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Risultato<\/strong><\/p>\n\n\n\n<p><strong>Tabella risultato (hierarchy)<\/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>ID<\/td><td>NOME<\/td><td>LIVELLO<\/td><\/tr><tr><td>I011<\/td><td>Employee_011<\/td><td>0<\/td><\/tr><tr><td>I021<\/td><td>Employee_021<\/td><td>1<\/td><\/tr><tr><td>I022<\/td><td>Employee_022<\/td><td>1<\/td><\/tr><tr><td>I023<\/td><td>Employee_023<\/td><td>1<\/td><\/tr><tr><td>I031<\/td><td>Employee_031<\/td><td>2<\/td><\/tr><tr><td>I032<\/td><td>Employee_032<\/td><td>2<\/td><\/tr><tr><td>I041<\/td><td>Employee_041<\/td><td>3<\/td><\/tr><tr><td>I042<\/td><td>Employee_042<\/td><td>3<\/td><\/tr><tr><td>I043<\/td><td>Employee_043<\/td><td>3<\/td><\/tr><tr><td>I045<\/td><td>Employee_045<\/td><td>3<\/td><\/tr><tr><td>I046<\/td><td>Employee_046<\/td><td>3<\/td><\/tr><tr><td>I047<\/td><td>Employee_047<\/td><td>3<\/td><\/tr><tr><td>I051<\/td><td>Employee_051<\/td><td>4<\/td><\/tr><tr><td>I052<\/td><td>Employee_052<\/td><td>4<\/td><\/tr><tr><td>I061<\/td><td>Employee_061<\/td><td>5<\/td><\/tr><tr><td>I062<\/td><td>Employee_062<\/td><td>5<\/td><\/tr><tr><td>I063<\/td><td>Employee_063<\/td><td>5<\/td><\/tr><tr><td>I064<\/td><td>Employee_064<\/td><td>5<\/td><\/tr><tr><td>I065<\/td><td>Employee_065<\/td><td>5<\/td><\/tr><tr><td>I066<\/td><td>Employee_066<\/td><td>5<\/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><strong>Definizione della Tabella dei Dipendenti (employee)<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La CTE <strong>employee<\/strong> viene definita come una tabella temporanea contenente tre colonne: <strong>ID<\/strong> (identificativo del dipendente), <strong>Nome<\/strong> (nome del dipendente) e <strong>IdManager<\/strong> (identificativo del manager di ciascun dipendente).<br>&nbsp;<\/li>\n\n\n\n<li>La tabella \u00e8 popolata con una serie di valori che rappresentano una struttura organizzativa aziendale. Ad esempio, &#8216;I011&#8217; \u00e8 un dipendente senza manager (<strong>NULL<\/strong>), il che implica che potrebbe essere un dirigente o un capo dipartimento (top Manager).<\/li>\n<\/ul>\n\n\n\n<p><strong>Costruzione della Gerarchia (hierarchy)<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La CTE <strong>hierarchy<\/strong> \u00e8 una CTE <strong>ricorsiva<\/strong> composta da due parti: una parte base e una parte ricorsiva, separate dall&#8217;operatore <strong>UNION ALL<\/strong>.<br>&nbsp;<\/li>\n\n\n\n<li><strong>Parte Base<\/strong>: Seleziona i dipendenti che non hanno un manager (<strong>IdManager IS NULL<\/strong>). Questi dipendenti rappresentano il punto di partenza della gerarchia (ad esempio, la direzione aziendale). A questi viene assegnato un <strong>Livello<\/strong> 0, indicando il livello pi\u00f9 alto della gerarchia.<br>&nbsp;<\/li>\n\n\n\n<li><strong>Parte Ricorsiva<\/strong>: Collega ogni dipendente al proprio manager attraverso un <strong>INNER JOIN<\/strong> tra la CTE <strong>employee<\/strong> e la stessa <strong>hierarchy<\/strong>. Ad ogni passaggio della ricorsione, il livello aumenta di 1 (<strong>h.Livello + 1<\/strong>), rappresentando cos\u00ec la posizione di ciascun dipendente nella gerarchia aziendale.<\/li>\n<\/ul>\n\n\n\n<p><strong>Selezione Finale<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La query finale <strong>SELECT * FROM hierarchy;<\/strong> seleziona tutti i record dalla CTE <strong>hierarchy<\/strong>, risultando in un elenco di dipendenti con i rispettivi livelli nella struttura organizzativa.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Considerazioni<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La CTE ricorsiva \u00e8 un modo efficace per gestire dati gerarchici o ricorsivi in SQL, specialmente quando la struttura dei dati non \u00e8 piatta ma nidificata o multi-livello.<br>&nbsp;<\/li>\n\n\n\n<li>Questo tipo di query pu\u00f2 essere particolarmente utile in ambienti aziendali dove la struttura organizzativa \u00e8 complessa.<br>&nbsp;<\/li>\n\n\n\n<li>\u00c8 importante notare che per evitare loop infiniti, la base della ricorsione (parte base della CTE) deve essere ben definita. In questo caso, si parte dai dipendenti senza un manager.<\/li>\n<\/ul>\n\n\n\n<p>Tenere presente che l\u2019implementazione e le funzionalit\u00e0 effettive potrebbero variare a seconda della versione del sistema operativo iSeries e del database DB2. \u00c8 sempre buona norma fare riferimento alla documentazione ufficiale IBM per avere informazioni pi\u00f9 precise e dettagliate<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le Common Table Expressions (CTE) in SQL su IBM iSeries (AS\/400) rappresentano uno strumento potente e flessibile per creare query temporanee e riutilizzabili, semplificando e migliorando la leggibilit\u00e0 delle query SQL complesse.. Di seguito gli articoli della serie CTE (incluso&#8230;<\/p>\n","protected":false},"author":3,"featured_media":4089,"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":[15,17],"tags":[46,124,128],"class_list":["post-4079","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","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\/4079","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=4079"}],"version-history":[{"count":15,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4079\/revisions"}],"predecessor-version":[{"id":4375,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4079\/revisions\/4375"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media\/4089"}],"wp:attachment":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media?parent=4079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/categories?post=4079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/tags?post=4079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}