{"id":4274,"date":"2024-01-10T17:28:00","date_gmt":"2024-01-10T16:28:00","guid":{"rendered":"https:\/\/www.skillup.cloud\/iseries-sql-cte-common-table-expressions-definizioni-e-utilizzo\/"},"modified":"2024-02-12T09:39:16","modified_gmt":"2024-02-12T08:39:16","slug":"iseries-sql-cte-common-table-expressions-definitions-and-usage","status":"publish","type":"post","link":"https:\/\/www.skillup.cloud\/en\/iseries-sql-cte-common-table-expressions-definitions-and-usage\/","title":{"rendered":"iSeries Sql &#8211; CTE Common Table Expressions &#8211; definitions and usage"},"content":{"rendered":"\n<p>Common Table Expressions (CTE) in SQL on IBM iSeries (AS\/400), as in other database management systems, are a powerful and flexible feature that allows you to create temporary, reusable queries within a larger SQL statement wide.<\/p>\n\n\n\n<p>They are particularly useful for structuring and simplifying complex queries, allowing for greater readability and maintainability of SQL code.<\/p>\n\n\n\n<p>Below are the articles in the CTE series (including this current one):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <\/span><a href=\"https:\/\/www.skillup.cloud\/en\/iseries-sql-cte-common-table-expressions-definitions-and-usage\/\" target=\"_blank\" rel=\"noreferrer noopener\">iSeries Sql &#8211; CTE Common Table Expressions &#8211; definitions and usage<\/a><span style=\"text-decoration: underline\"> <\/span><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <\/span><a href=\"https:\/\/www.skillup.cloud\/en\/recursive-cte-the-elegance-of-simplicity-in-sql-1\/\" target=\"_blank\" rel=\"noreferrer noopener\">Recursive CTE: The Elegance of Simplicity in SQL &#8211; 1<\/a><span style=\"text-decoration: underline\"> <\/span><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <\/span><a href=\"https:\/\/www.skillup.cloud\/en\/recursive-cte-the-elegance-of-simplicity-in-sql-2\/\" target=\"_blank\" rel=\"noreferrer noopener\">Recursive CTE: The Elegance of Simplicity in SQL \u2013 2<\/a><span style=\"text-decoration: underline\"> <\/span><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <\/span><a href=\"https:\/\/www.skillup.cloud\/en\/recursive-cte-the-elegance-of-simplicity-in-sql-3\/\" target=\"_blank\" rel=\"noreferrer noopener\">Recursive CTE: The Elegance of Simplicity in SQL \u2013 3<\/a><\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"text-decoration: underline\"> <\/span><a href=\"https:\/\/www.skillup.cloud\/en\/recursive-cte-how-to-concatenate-the-results-onto-a-single-line\/\" target=\"_blank\" rel=\"noreferrer noopener\">Recursive CTE how to concatenate the results onto a single line<\/a><span style=\"text-decoration: underline\"> <\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"has-large-font-size\"><strong>Technical Description of CTEs<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"1\">\n<li><strong>Definition<\/strong>: A CTE is essentially a temporary query that exists only for the duration of a specific SQL statement. It is defined at the beginning of a query and can then be used as a normal table within that same SQL statement.<br><\/li>\n\n\n\n<li><strong>Syntax<\/strong>: A CTE is defined using the <strong>WITH<\/strong> clause, followed by the name of the CTE, an optional list of columns, and the query that populates the CTE. The general syntax is:<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>Reuse<\/strong>: A CTE can be used multiple times within a single SQL statement. This makes it useful for breaking complex queries into smaller, more manageable pieces, to avoid code duplication, and to improve readability.<br>\u00a0<\/li>\n\n\n\n<li><strong>Recursive Queries<\/strong>: CTEs provide the ability to write recursive queries, which are particularly useful for working with hierarchical data or performing iterative calculations. A recursive CTE self-references to create a series of repeating results until a termination condition is reached.<br>\u00a0<\/li>\n\n\n\n<li><strong>Performance<\/strong>: While CTEs can improve the readability of code, their performance efficiency depends on the specific database implementation and the nature of the query. In some cases, they can be more efficient than equivalent subqueries, but not always.<br>\u00a0<\/li>\n\n\n\n<li><strong>Compatibility<\/strong>: CTEs are supported by most modern database management systems, including IBM DB2 for iSeries, SQL Server, PostgreSQL, MySQL (recent versions), and others.<br>\u00a0<\/li>\n\n\n\n<li><strong>Applications<\/strong>: CTEs are widely used to simplify complex queries, to execute recursive queries, to prepare data for aggregation, to organize multi-step queries, and to improve the overall structure of SQL queries.<\/li>\n<\/ol>\n\n\n\n<p><strong>Considerations for IBM iSeries<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On IBM iSeries, the availability and specific features of CTEs may depend on the version of DB2.<br>\u00a0<\/li>\n\n\n\n<li>It is important to check the specific DB2 on iSeries documentation to ensure that all CTE features are supported and to understand best practices for using them.<\/li>\n<\/ul>\n\n\n\n<p>Let&#8217;s see some examples of use.<\/p>\n\n\n\n<p class=\"has-large-font-size\" id=\"numerazione-over-partition\"><strong>CTE Common Table Expression to assign numbering over \u201cpartition by\u201d<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Description Context and Objective<\/strong><\/p>\n\n\n\n<p>The query in question is designed to operate on a table that records transactions, identified by a transaction ID (<strong>TRANS_ID<\/strong>) and associated with a specific movement date (<strong>DATE_MOV)<\/strong>.<\/p>\n\n\n\n<p>While the original table may contain other relevant information, for the purpose of this query, the focus is solely on <strong>TRANS_ID<\/strong> and <strong>DATE_MOV<\/strong>.<\/p>\n\n\n\n<p>The main objective is to generate a list in which each transaction is listed with a unique sequential number and its movement date.<\/p>\n\n\n\n<p>This sequential number starts at 1 for each transaction date and increases by one for each subsequent transaction that occurs on the same date.<\/p>\n\n\n\n<p>In other words, the query assigns a sequential number to the transactions, restarting the count from 1 for each new movement date, thus ensuring that each transaction receives a unique identifier within its specific day.<\/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>Result<\/strong><\/p>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<p>Original table (W1)<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<p>Result table (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>Detailed description of the query<\/strong><\/p>\n\n\n\n<p>The SQL query uses Common Table Expressions to create a sample dataset and then assign a sequential number to each row within groups based on the date of movement (<strong>DATE_MOV<\/strong>), sorting by the transaction ID (<strong>TRANS_ID<\/strong>).<\/p>\n\n\n\n<p>The query is divided into two main parts:<\/p>\n\n\n\n<p><strong>W1: Definition of Starting Data<\/strong><\/p>\n\n\n\n<p>The first CTE, <strong>W1<\/strong>, defines a starting dataset with two columns: <strong>TRANS_ID<\/strong> and <strong>DATE_MOV<\/strong>. Values \u200b\u200bare manually entered to simulate real data.<\/p>\n\n\n\n<p><strong>W2: Assignment of the Progressive Number<\/strong><\/p>\n\n\n\n<p>The second CTE, <strong>W2<\/strong>, is based on the data defined in W1. Use the <strong>ROW_NUMBER<\/strong>() function to assign a sequential number to each transaction (<strong>TRANS_ID<\/strong>) within each date (<strong>DATE_MOV<\/strong>). The <strong>ROW_NUMBER<\/strong>() function is partitioned by <strong>DATE_MOV<\/strong> to ensure that the numbering starts again at 1 for each new date. Additionally, the order is established by the <strong>TRANS_ID<\/strong> to determine the order of number assignment within each date group<\/p>\n\n\n\n<p>Let&#8217;s analyze this part in more detail:<\/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>This expression is an example of a window function in SQL, specifically <strong>ROW_NUMBER<\/strong>(), that is used to assign a unique sequential number to each row within a query result set. Let&#8217;s examine each component of this expression:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ROW_ ROW_NUMBER()<\/strong> is a window function that assigns a sequential number to each row in a result set. The number starts at 1 for the first row and increases by 1 for each subsequent row<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OVER (PARTITION BY DATE_MOV ORDER BY W1.TRANS_ID)<\/strong> The <strong>OVER<\/strong> clause specifies how the <strong>ROW_NUMBER<\/strong>() window function should be applied to the result set.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PARTITION BY DATE_MOV<\/strong>: This divides the result set into partitions (or groups) based on the value of the <strong>DATE_MOV<\/strong> column. The <strong>ROW_NUMBER<\/strong>() function is then applied within each of these partitions separately. This means that the counting starts again from 1 for each new date (<strong>DATE_MOV<\/strong>). In other words, each date will have its own set of sequential numbers.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ORDER BY W1.TRANS_ID<\/strong>: Within each partition (created based on <strong>DATE_MOV<\/strong>), the rows are sorted based on the value of <strong>TRANS_ID<\/strong>. The <strong>ROW_NUMBER<\/strong>() function assigns sequential numbers to these rows based on this order. So, for each date, the first transaction in the order will have the number 1, the second will have the number 2, and so on.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>AS ROW_NUM<\/strong>: Finally, <strong>AS ROW_NUM<\/strong> assigns a name to the column that contains the progressive number generated by the <strong>ROW_NUMBER()<\/strong> function. In this case, the column will be named <strong>ROW_NUM<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>Please note that actual implementation and functionality may vary depending on the version of the iSeries operating system and DB2 database. It is always good practice to refer to the official IBM documentation for more precise and detailed information<\/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 to detect breaks in the number sequence<\/strong><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Description Context and Objective<\/strong><\/p>\n\n\n\n<p>The query in question is designed to operate on a table that records transactions, identified by a Movement Code (<strong>MovCode<\/strong>) and associated with a specific identifier (<strong>NumberID<\/strong>).<\/p>\n\n\n\n<p>While the original table may contain other relevant information, for the purpose of this query, the focus is solely on <strong>MovCode<\/strong> and <strong>NumberID<\/strong>.<\/p>\n\n\n\n<p>The main objective is to generate a list in which to identify and mark any breaks in the numerical sequence of identification numbers (<strong>NumberID<\/strong>) for each Movement Code (<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>Result<\/strong><\/p>\n\n\n\n<div class=\"wp-block-columns\">\n<div class=\"wp-block-column\">\n<p>Original table ( XX )<\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column\">\n<p>Result table (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\">Detailed description of the query<\/p>\n\n\n\n<p>This SQL query uses CTE (Common Table Expressions) and the <strong>LEAD<\/strong> function to identify and mark any breaks in the numerical sequence of identification numbers (NumberID) for each Movement Code (MovCode).<\/p>\n\n\n\n<p>Here is a detailed explanation of each part of the query:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CTE Initial xx<\/strong>: This CTE defines a set of example values \u200b\u200brepresenting pairs of <strong>MovCode<\/strong> and <strong>NumberID<\/strong>. It is a temporary table used to demonstrate query logic.<\/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>Use data from the <strong>CTE<\/strong> <strong>xx<\/strong>.<\/li>\n\n\n\n<li>Apply the <strong>LEAD<\/strong> function to get the next <strong>NumberID<\/strong> (<strong>NextNumberID<\/strong>) for each <strong>MovCode<\/strong>, sorting by <strong>NumberID<\/strong>.<\/li>\n\n\n\n<li>The <strong>LEAD<\/strong> function is a window function that provides access to a line a certain physical distance from the current line, in this case, the next line.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Final Selection and CASE Logic<\/strong>:\n<ul class=\"wp-block-list\">\n<li>The final query selects <strong>MovCode<\/strong> and a modified version of <strong>NumberID<\/strong>.<\/li>\n\n\n\n<li>CASE logic is used to determine what to show for <strong>NumberID<\/strong>:\n<ul class=\"wp-block-list\">\n<li>If <strong>NextNumberID<\/strong> is <strong>NULL<\/strong>, this indicates that it is the latest identification number for that MovCode, so it simply shows <strong>NumberID<\/strong>.<\/li>\n\n\n\n<li>If <strong>NumberID<\/strong> is consecutive to <strong>NextNumberID<\/strong> (<strong>NumberID = NextNumberID &#8211; 1<\/strong>), show <strong>NumberID<\/strong>.<\/li>\n\n\n\n<li>Otherwise, if there is a break in the sequence (i.e., the NumberID is not followed by the consecutive number), appends &#8216;***&#8217; to <strong>NumberID<\/strong> to signal the break.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sorting of Results<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Results are sorted by <strong>MovCode<\/strong> and <strong>NumberID<\/strong>, ensuring that output is presented neatly and sequentially for each MovCode.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Please note that actual implementation and functionality may vary depending on the version of the iSeries operating system and DB2 database.<\/p>\n\n\n\n<p>It is always good practice to refer to the official IBM documentation for more precise and detailed information<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Common Table Expressions (CTE) in SQL on IBM iSeries (AS\/400), as in other database management systems, are a powerful and flexible feature that allows you to create temporary, reusable queries within a larger SQL statement wide. They are particularly useful&#8230;<\/p>\n","protected":false},"author":3,"featured_media":4181,"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":[141,143],"tags":[46,160,248,249,250],"class_list":["post-4274","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-manage-as400-with-sql","category-more-in-depth","tag-sql","tag-cte-common-table-expression-en","tag-lead-over-en","tag-row_number-over-en","tag-window-function-en"],"_links":{"self":[{"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/posts\/4274","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/comments?post=4274"}],"version-history":[{"count":11,"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/posts\/4274\/revisions"}],"predecessor-version":[{"id":4397,"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/posts\/4274\/revisions\/4397"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/media\/4181"}],"wp:attachment":[{"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/media?parent=4274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/categories?post=4274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skillup.cloud\/en\/wp-json\/wp\/v2\/tags?post=4274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}