{"id":4069,"date":"2024-01-10T17:28:00","date_gmt":"2024-01-10T16:28:00","guid":{"rendered":"https:\/\/www.skillup.cloud\/?p=4069"},"modified":"2024-02-11T16:22:27","modified_gmt":"2024-02-11T15:22:27","slug":"iseries-sql-cte-common-table-expressions-definizioni-e-utilizzo","status":"publish","type":"post","link":"https:\/\/www.skillup.cloud\/it\/iseries-sql-cte-common-table-expressions-definizioni-e-utilizzo\/","title":{"rendered":"iSeries Sql &#8211; CTE Common Table Expressions &#8211; definizioni e utilizzo"},"content":{"rendered":"\n<p>Le Common Table Expressions (CTE) in SQL su IBM iSeries (AS\/400), come in altri sistemi di gestione di database, sono una caratteristica potente e flessibile che permette di creare query temporanee e riutilizzabili all&#8217;interno di un&#8217;istruzione SQL pi\u00f9 ampia.<\/p>\n\n\n\n<p>Sono particolarmente utili per strutturare e semplificare query complesse, consentendo una maggiore leggibilit\u00e0 e manutenibilit\u00e0 del codice SQL.<\/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\/iseries-sql-cte-common-table-expressions-definizioni-e-utilizzo\/\" 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 class=\"has-large-font-size\"><strong>Descrizione Tecnica delle CTE<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"1\">\n<li><strong>Definizione<\/strong>: Una CTE \u00e8 essenzialmente una query temporanea che esiste solo per la durata di una specifica istruzione SQL. \u00c8 definita all&#8217;inizio di una query e pu\u00f2 essere poi utilizzata come una normale tabella all&#8217;interno di quella stessa istruzione SQL.<br>&nbsp;<\/li>\n\n\n\n<li><strong>Sintassi<\/strong>: Una CTE viene definita utilizzando la clausola <strong>WITH<\/strong>, seguita dal nome della CTE, un elenco facoltativo di colonne e la query che popola la CTE. La sintassi generale \u00e8:<br><pre class=\"wp-block-preformatted\">WITH NomeCTE (Colonna1, Colonna2, ...) AS ( SELECT ... FROM ... WHERE ... ) SELECT * FROM NomeCTE;<\/pre><\/li>\n\n\n\n<li><strong>Riutilizzo<\/strong>: Una CTE pu\u00f2 essere utilizzata pi\u00f9 volte all&#8217;interno di un&#8217;unica istruzione SQL. Questo la rende utile per dividere query complesse in parti pi\u00f9 piccole e gestibili, per evitare la duplicazione di codice e per migliorare la leggibilit\u00e0.<br>&nbsp;<\/li>\n\n\n\n<li><strong>Query Ricorsive<\/strong>: Le CTE offrono la possibilit\u00e0 di scrivere query ricorsive, che sono particolarmente utili per lavorare con dati gerarchici o per eseguire calcoli iterativi. Una CTE ricorsiva si auto-referenzia per creare una serie di risultati ripetuti fino al raggiungimento di una condizione di terminazione.<br>&nbsp;<\/li>\n\n\n\n<li><strong>Performance<\/strong>: Mentre le CTE possono migliorare la leggibilit\u00e0 del codice, la loro efficienza in termini di prestazioni dipende dalla specifica implementazione del database e dalla natura della query. In alcuni casi, possono essere pi\u00f9 efficienti di subquery equivalenti, ma non sempre.<br>&nbsp;<\/li>\n\n\n\n<li><strong>Compatibilit\u00e0<\/strong>: Le CTE sono supportate dalla maggior parte dei moderni sistemi di gestione di database, inclusi IBM DB2 per iSeries, SQL Server, PostgreSQL, MySQL (versioni recenti), e altri.<br>&nbsp;<\/li>\n\n\n\n<li><strong>Applicazioni<\/strong>: Le CTE sono ampiamente utilizzate per semplificare query complesse, per eseguire query ricorsive, per preparare dati per l&#8217;aggregazione, per organizzare query con pi\u00f9 passaggi, e per migliorare la struttura generale delle query SQL.<\/li>\n<\/ol>\n\n\n\n<p><strong>Considerazioni per IBM iSeries<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Su IBM iSeries, la disponibilit\u00e0 e le caratteristiche specifiche delle CTE possono dipendere dalla versione del DB2.<br>&nbsp;<\/li>\n\n\n\n<li>\u00c8 importante verificare la documentazione specifica del DB2 su iSeries per assicurarsi che tutte le funzionalit\u00e0 delle CTE siano supportate e per capire le migliori pratiche per il loro utilizzo.<\/li>\n<\/ul>\n\n\n\n<p>vediamo alcuni esempi di utilizzo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"><a href=\"#numerazione-over-partition\"> CTE Common Table Expression per assegnare numerazione over \u201cpartition by\u201d<\/a> <\/span><\/li>\n\n\n\n<li><span style=\"text-decoration: underline\"> <a href=\"#sequenza-numerica\">CTE Common Table Expression per individuare interruzioni nella sequenza numerica<\/a> <\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"has-large-font-size\" id=\"numerazione-over-partition\"><strong>CTE Common Table Expression per assegnare numerazione over \u201cpartition by\u201d<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Descrizione Contesto e Obiettivo<\/strong><\/p>\n\n\n\n<p>La query in questione \u00e8 progettata per operare su una tabella che registra le transazioni, identificate da un ID di transazione (<strong>TRANS_ID<\/strong>) e associate a una specifica data di movimento (<strong>DATE_MOV<\/strong>).<\/p>\n\n\n\n<p>Mentre la tabella originale potrebbe contenere altre informazioni pertinenti, per lo scopo di questa query, l&#8217;attenzione \u00e8 focalizzata esclusivamente su <strong>TRANS_ID<\/strong> e <strong>DATE_MOV<\/strong>.<\/p>\n\n\n\n<p>L&#8217;obiettivo principale \u00e8 generare un elenco in cui ogni transazione \u00e8 elencata con un numero progressivo unico e la relativa data di movimento.<\/p>\n\n\n\n<p>Questo numero progressivo inizia da 1 per ciascuna data di movimento e aumenta di uno per ogni transazione successiva che si verifica nella stessa data.<\/p>\n\n\n\n<p>In altre parole, la query assegna un numero sequenziale alle transazioni, riavviando il conteggio da 1 per ogni nuova data di movimento, garantendo cos\u00ec che ciascuna transazione riceva un identificatore univoco all&#8217;interno del suo specifico giorno.<\/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 -- starting data\n     W1 (TRANS_ID, DATE_MOV) AS (\n         VALUES  ('T0011', '2024-01-10'), ('T0012', '2024-01-10'), ('T0013', '2024-01-10')\n               , ('T0014', '2024-01-10'), ('T0015', '2024-01-10'), ('T0016', '2024-01-10')\n               , ('T0017', '2024-01-10'), ('T0018', '2024-01-10'), ('T0019', '2024-01-10')\n               , ('T0020', '2024-01-10'), ('T0023', '2024-01-10'), ('T0024', '2024-01-10')\n               , ('T0025', '2024-01-10'), ('T0026', '2024-01-10'), ('T0127', '2024-01-10')\n               , ('T0128', '2024-01-10'), ('T0129', '2024-01-10'), ('T0149', '2024-01-10')\n               , ('T0150', '2024-01-11'), ('T0151', '2024-01-11'), ('T0152', '2024-01-11')\n               , ('T0165', '2024-01-11'), ('T0166', '2024-01-11'), ('T0167', '2024-01-11')\n               , ('T0168', '2024-01-11'), ('T0201', '2024-01-11'))\n     --  assigns progressive numbering to the same DATA_MOV, ordering by TRANS_ID\n   , W2 (TRANS_ID, ROW_NUM, DATE_MOV)\n     as (select trim(W1.TRANS_ID)\n              , row_number() over ( partition by DATE_MOV -- 'COMMON_VALUE'\n                 order by W1.TRANS_ID) ROW_NUM\n              , W1.DATE_MOV\n          from W1 order by  W1.TRANS_ID)\nselect * from W2;\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<p>Tabella originale (W1)<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<p>Tabella risultato (W2)<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<pre class=\"wp-block-preformatted\">TRANS_ID DATE_MOV\nT0011    2024-01-10\nT0012    2024-01-10\nT0013    2024-01-10\nT0014    2024-01-10\nT0015    2024-01-10\nT0016    2024-01-10\nT0017    2024-01-10\nT0018    2024-01-10\nT0019    2024-01-10\nT0020    2024-01-10\nT0023    2024-01-10\nT0024    2024-01-10\nT0025    2024-01-10\nT0026    2024-01-10\nT0127    2024-01-10\nT0128    2024-01-10\nT0129    2024-01-10\nT0149    2024-01-10\nT0150    2024-01-11\nT0151    2024-01-11\nT0152    2024-01-11\nT0165    2024-01-11\nT0166    2024-01-11\nT0167    2024-01-11\nT0168    2024-01-11\nT0201    2024-01-11<\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<pre class=\"wp-block-preformatted\">TRANS_ID ROW_NUM  DATE_MOV\nT0011          1  2024-01-10\nT0012          2  2024-01-10\nT0013          3  2024-01-10\nT0014          4  2024-01-10\nT0015          5  2024-01-10\nT0016          6  2024-01-10\nT0017          7  2024-01-10\nT0018          8  2024-01-10\nT0019          9  2024-01-10\nT0020         10  2024-01-10\nT0023         11  2024-01-10\nT0024         12  2024-01-10\nT0025         13  2024-01-10\nT0026         14  2024-01-10\nT0127         15  2024-01-10\nT0128         16  2024-01-10\nT0129         17  2024-01-10\nT0149         18  2024-01-10\nT0150          1  2024-01-11\nT0151          2  2024-01-11\nT0152          3  2024-01-11\nT0165          4  2024-01-11\nT0166          5  2024-01-11\nT0167          6  2024-01-11\nT0168          7  2024-01-11\nT0201          8  2024-01-11\n<\/pre>\n<\/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 SQL utilizza Common Table Expressions per creare un set di dati di esempio e poi assegnare un numero progressivo a ciascuna riga all&#8217;interno di gruppi basati sulla data del movimento (<strong>DATE_MOV<\/strong>), ordinando per l&#8217;ID della transazione (<strong>TRANS_ID<\/strong>).<\/p>\n\n\n\n<p>La query \u00e8 divisa in due parti principali:<\/p>\n\n\n\n<p><strong>W1: Definizione dei Dati di Partenza<\/strong><\/p>\n\n\n\n<p>La prima CTE, <strong>W1<\/strong>, definisce un set di dati di partenza con due colonne: <strong>TRANS_ID<\/strong> e <strong>DATE_MOV<\/strong>. Vengono inseriti manualmente dei valori per simulare i dati reali.<\/p>\n\n\n\n<p><strong>W2: Assegnazione del Numero Progressivo<\/strong><\/p>\n\n\n\n<p>La seconda CTE, <strong>W2<\/strong>, si basa sui dati definiti in <strong>W1<\/strong>. Utilizza la funzione <strong>ROW_NUMBER()<\/strong> per assegnare un numero progressivo a ciascuna transazione (<strong>TRANS_ID<\/strong>) all&#8217;interno di ogni data (<strong>DATE_MOV<\/strong>). La funzione <strong>ROW_NUMBER()<\/strong> \u00e8 partizionata per <strong>DATE_MOV<\/strong> per garantire che la numerazione ricominci da 1 per ciascuna nuova data. Inoltre, l&#8217;ordine \u00e8 stabilito dall&#8217;<strong>TRANS_ID<\/strong> per determinare l&#8217;ordine di assegnazione dei numeri all&#8217;interno di ogni gruppo di date.<\/p>\n\n\n\n<p>Analizziamo pi\u00f9 in dettaglio questa parte:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ROW_NUMBER() OVER (PARTITION BY DATE_MOV ORDER BY W1.TRANS_ID) AS ROW_NUM,<\/pre>\n\n\n\n<p>Questa espressione \u00e8 un esempio di una funzione di finestra in SQL, nello specifico <strong>ROW_NUMBER()<\/strong>, che viene utilizzata per assegnare un numero progressivo unico a ogni riga all&#8217;interno di un set di risultati di una query. Andiamo a esaminare ogni componente di questa espressione:<\/p>\n\n\n\n<p><strong>ROW_ ROW_NUMBER()<br><\/strong> \u00e8 una funzione di finestra (window functions) che assegna un numero sequenziale a ogni riga in un set di risultati. Il numero inizia da 1 per la prima riga e aumenta di 1 per ogni riga successiva.<\/p>\n\n\n\n<p><strong>OVER (PARTITION BY DATE_MOV ORDER BY W1.TRANS_ID)<\/strong><br>La clausola <strong>OVER<\/strong> specifica come la funzione di finestra <strong>ROW_NUMBER()<\/strong> deve essere applicata al set di risultati.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PARTITION BY DATE_MOV<\/strong>: Questo divide il set di risultati in partizioni (o gruppi) basati sul valore della colonna <strong>DATE_MOV<\/strong>. La funzione <strong>ROW_NUMBER()<\/strong> viene poi applicata all&#8217;interno di ciascuna di queste partizioni separatamente. Ci\u00f2 significa che il conteggio ricomincia da 1 per ogni nuova data (<strong>DATE_MOV<\/strong>). In altre parole, ciascuna data avr\u00e0 il proprio set di numeri progressivi.<\/li>\n\n\n\n<li><strong>ORDER BY W1.TRANS_ID<\/strong>: All&#8217;interno di ogni partizione (creata in base a <strong>DATE_MOV<\/strong>), le righe vengono ordinate in base al valore di <strong>TRANS_ID<\/strong>. La funzione <strong>ROW_NUMBER()<\/strong> assegna numeri progressivi a queste righe in base a quest&#8217;ordine. Quindi, per ogni data, la prima transazione nell&#8217;ordine avr\u00e0 il numero 1, la seconda il numero 2, e cos\u00ec via.<\/li>\n<\/ul>\n\n\n\n<p><strong>AS ROW_NUM<\/strong><br>Infine, <strong>AS ROW_NUM<\/strong> assegna un nome alla colonna che contiene il numero progressivo generato dalla funzione <strong>ROW_NUMBER()<\/strong>. In questo caso, la colonna sar\u00e0 denominata <strong>ROW_NUM<\/strong>.<\/p>\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\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-large-font-size\" id=\"sequenza-numerica\"><strong>CTE Common Table Expression per individuare interruzioni nella sequenza numerica<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Descrizione Contesto e Obiettivo<\/strong><\/p>\n\n\n\n<p>La query in questione \u00e8 progettata per operare su una tabella che registra le transazioni, identificate da un Codice Movimento (<strong>MovCode<\/strong>) e associate a uno specifico identificativo (<strong>NumberID<\/strong>).<\/p>\n\n\n\n<p>Mentre la tabella originale potrebbe contenere altre informazioni pertinenti, per lo scopo di questa query, l&#8217;attenzione \u00e8 focalizzata esclusivamente su <strong>MovCode<\/strong> e <strong>NumberID<\/strong>.<\/p>\n\n\n\n<p>L&#8217;obiettivo principale \u00e8 generare un elenco in cui identificare e contrassegnare eventuali interruzioni nella sequenza numerica dei numeri identificativi (<strong>NumberID<\/strong>) per ogni Codice Movimento (<strong>MovCode<\/strong>).<\/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 xx (MovCode, NumberID)\n        AS (VALUES ('A1002','101')\n                  ,('A1002','102')\n                  ,('A1002','104')\n                  ,('A1002','105')\n                  ,('A1002','108')\n                  ,('A1002','109')\n                  ,('A1002','110')\n                  ,('B2002','201')\n                  ,('B2002','202')\n                  ,('B2002','203')\n                  ,('B2002','204')\n                  ,('B2002','210')\n                  ,('B2002','211')\n                  ,('B2002','214'))\n   , CTE_CheckRegister (MovCode, NumberID, NextNumberID)\n        AS (\n              SELECT MovCode,\n                     NumberID,\n                     Lead(NumberID, 1) OVER (PARTITION BY MovCode ORDER BY NumberID) NextNumberID\n              FROM xx\n           )\nSELECT   MovCode,\n         CASE\n            WHEN NextNumberID is NULL THEN NumberID\n            WHEN (NumberID = NextNumberID - 1) THEN NumberID\n            ELSE NumberID concat ' ***'\n         END as NumberID\nFROM     CTE_CheckRegister\nORDER BY MovCode, NumberID;<\/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<p>Tabella originale ( XX )<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<p>Tabella risultato (CTE_CheckRegister)<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<pre class=\"wp-block-preformatted\">MOVCODE\tNUMBERID\nA1002\t101\nA1002\t102\nA1002\t104\nA1002\t105\nA1002\t108\nA1002\t109\nA1002\t110\nB2002\t201\nB2002\t202\nB2002\t203\nB2002\t204\nB2002\t210\nB2002\t211\nB2002\t214<\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<pre class=\"wp-block-preformatted\">MOVCODE\tNUMBERID\nA1002\t101\nA1002\t102 ***\nA1002\t104\nA1002\t105 ***\nA1002\t108\nA1002\t109\nA1002\t110\nB2002\t201\nB2002\t202\nB2002\t203\nB2002\t204 ***\nB2002\t210\nB2002\t211 ***\nB2002\t214<\/pre>\n<\/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>Questa query SQL utilizza le CTE (Common Table Expressions) e la funzione <strong>LEAD<\/strong> per identificare e contrassegnare eventuali interruzioni nella sequenza numerica dei numeri identificativi (NumberID) per ogni Codice Movimento (MovCode).<\/p>\n\n\n\n<p>Ecco una spiegazione dettagliata di ciascuna parte della query:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CTE Iniziale xx<\/strong>: Questa CTE definisce un set di valori di esempio che rappresentano coppie di <strong>MovCode<\/strong> e <strong>NumberID<\/strong>. \u00c8 una tabella temporanea utilizzata per dimostrare la logica della query.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CTE CTE_CheckRegister<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Utilizza i dati dalla CTE <strong>xx<\/strong>.<\/li>\n\n\n\n<li>Applica la funzione <strong>LEAD<\/strong> per ottenere il numero del prossimo NumberID (<strong>NextNumberID<\/strong>) per ogni <strong>MovCode<\/strong>, ordinando per <strong>NumberID<\/strong>.<\/li>\n\n\n\n<li>La funzione <strong>LEAD<\/strong> \u00e8 una funzione di finestra che fornisce l&#8217;accesso a una riga a una certa distanza fisica dalla riga corrente, in questo caso, la riga successiva.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Selezione Finale e Logica CASE<\/strong>:\n<ul class=\"wp-block-list\">\n<li>La query finale seleziona <strong>MovCode<\/strong> e una versione modificata di <strong>NumberID<\/strong>.<\/li>\n\n\n\n<li>La logica CASE viene utilizzata per determinare cosa mostrare per <strong>NumberID<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Se <strong>NextNumberID<\/strong> \u00e8 <strong>NULL<\/strong>, ci\u00f2 indica che \u00e8 l&#8217;ultimo numero identificativo per quel MovCode, quindi mostra semplicemente <strong>NumberID<\/strong>.<\/li>\n\n\n\n<li>Se <strong>NumberID<\/strong> \u00e8 consecutivo al <strong>NextNumberID<\/strong> (<strong>NumberID = NextNumberID &#8211; 1<\/strong>), mostra <strong>NumberID<\/strong>.<\/li>\n\n\n\n<li>Altrimenti, se c&#8217;\u00e8 un&#8217;interruzione nella sequenza (cio\u00e8, il numero NumberID non \u00e8 seguito dal numero consecutivo), aggiunge &#8216; ***&#8217; a <strong>NumberID<\/strong> per segnalare l&#8217;interruzione.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ordinamento dei Risultati<\/strong>:\n<ul class=\"wp-block-list\">\n<li>I risultati sono ordinati per <strong>MovCode<\/strong> e <strong>NumberID<\/strong>, garantendo che l&#8217;output sia presentato in modo ordinato e sequenziale per ogni MovCode.<\/li>\n<\/ul>\n<\/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), come in altri sistemi di gestione di database, sono una caratteristica potente e flessibile che permette di creare query temporanee e riutilizzabili all&#8217;interno di un&#8217;istruzione SQL pi\u00f9 ampia. Sono&#8230;<\/p>\n","protected":false},"author":3,"featured_media":4078,"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,125,126,127],"class_list":["post-4069","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-row_number-over","tag-lead-over","tag-window-function"],"_links":{"self":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4069","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=4069"}],"version-history":[{"count":16,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4069\/revisions"}],"predecessor-version":[{"id":4372,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/posts\/4069\/revisions\/4372"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media\/4078"}],"wp:attachment":[{"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/media?parent=4069"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/categories?post=4069"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skillup.cloud\/it\/wp-json\/wp\/v2\/tags?post=4069"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}