[ WITH [ RECURSIVE ]<cte_name1> ( <cte_column_list> ) AS ( anchorClause UNION ALL recursiveClause ) [ , <cte_name2> ( <cte_column_list> ) AS ( anchorClause UNION ALL recursiveClause ) ] [ , <cte_nameN> ( <cte_column_list> ) AS ( anchorClause UNION ALL recursiveClause ) ]]SELECT ...
The RECURSIVE keyword does not exist in T-SQL, and the transformation does not actively add the keyword to the result. A warning is added to the output code in order to state this behavior.
Common Table Expression with SELECT INTO
The following transformation occurs when the WITH expression is followed by an SELECT INTO statement and it will be transformed into a TEMPORARY TABLE.
SQL Server:
IN -> SqlServer_01.sql
WITH ctetable(col1, col2) AS (SELECT col1, col2 FROM t1 poh WHERE poh.col1 =16and poh.col2 =4 ), employeeCte AS (SELECT BUSINESSENTITYID, VACATIONHOURS FROM employee WHERE BUSINESSENTITYID = (SELECT col1 FROM ctetable) ), finalCte AS (SELECT BUSINESSENTITYID, VACATIONHOURS FROM employeeCte ) SELECT*INTO #table2 FROM finalCte;SELECT*FROM #table2;
Snowflake:
OUT -> SqlServer_01.sql
CREATEORREPLACE TEMPORARY TABLE T_table2 ASWITH ctetable ( col1, col2 ) AS (SELECT col1, col2FROM t1 pohWHERE poh.col1 =16and poh.col2 =4 ), employeeCte AS (SELECT BUSINESSENTITYID, VACATIONHOURSFROM employeeWHERE BUSINESSENTITYID = !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (SELECT col1FROM ctetable ) ), finalCte AS (SELECT BUSINESSENTITYID, VACATIONHOURSFROM employeeCte )SELECT*FROM finalCte;SELECT*FROM T_table2;
Common Table Expression with other expressions
The following transformation occurs when the WITH expression is followed by INSERT or DELETE statements.
SQL Server:
IN -> SqlServer_02.sql
WITH CTE AS( SELECT*from table1)INSERT INTO Table2 (a,b,c,d)SELECT a,b,c,dFROM CTEWHERE e IS NOT NULL;
Snowflake:
OUT -> SqlServer_02.sql
INSERT INTO Table2 (a, b, c, d)WITH CTE AS( SELECT*fromtable1)SELECTa,b,c,dFROMCTE AS CTEWHEREe IS NOT NULL;
Common Table Expression with Delete From
For this transformation, it will only apply for a CTE (Common Table Expression) with a Delete From, however, only for some specifics CTE. It must have only one CTE, and it must have inside a function of ROW_NUMBER or RANK.
The purpose of the CTE with the Delete must be to remove duplicates from a table. In case that the CTE with Delete intents to remove another kind of data, this transformation will not apply.
Let's see an example. For a working example, we must first create a table with some data.
CREATETABLEWithQueryTest( ID BIGINT,ValueBIGINT, StringValue NVARCHAR(258));Insert into WithQueryTest values(100, 100, 'First');Insert into WithQueryTest values(200, 200, 'Second');Insert into WithQueryTest values(300, 300, 'Third');Insert into WithQueryTest values(400, 400, 'Fourth');Insert into WithQueryTest values(100, 100, 'First');
Note that there is a duplicated value. The lines 8 and 12 insert the same value. Now we are going to eliminate the duplicates rows in a table.
WITH Duplicated AS (SELECT*, ROW_NUMBER() OVER (PARTITIONBY ID ORDER BY ID) AS RNFROM WithQueryTest)DELETEFROM DuplicatedWHERE Duplicated.RN >1
If we execute a Select from the table, it will show the following result
Note that there are no duplicateds rows. In order to conserve the functionality of these CTE with Delete in Snowflake, it will be transformed to
CREATE OR REPLACETABLEPUBLIC.WithQueryTest ASSELECT*FROM PUBLIC.WithQueryTestQUALIFY ROW_NUMBER()OVER (PARTITIONBY ID ORDER BY ID) =1 ;
As you can see, the query is transformed to a Create Or Replace Table.
Let's try it in Snowflake, in order to test it, we need the table too.
CREATE OR REPLACETABLEPUBLIC.WithQueryTest(ID BIGINT,ValueBIGINT,StringValue VARCHAR(258));Insert into PUBLIC.WithQueryTest values(100, 100, 'First');Insert into PUBLIC.WithQueryTest values(200, 200, 'Second');Insert into PUBLIC.WithQueryTest values(300, 300, 'Third');Insert into PUBLIC.WithQueryTest values(400, 400, 'Fourth');Insert into PUBLIC.WithQueryTest values(100, 100, 'First');
Now, if we execute the result of the transformation, and then a Select to check if the duplicated rows were deleted, this would be the result.
Common Table Expression with MERGE statement
The following transformation occurs when the WITH expression is followed by MERGE statement and it will be transformed into a MERGE INTO.
SQL Server:
IN -> SqlServer_03.sql
WITH ctetable(col1, col2) as (SELECT col1, col2FROM t1 pohwhere poh.col1 =16and poh.col2 =88 ), finalCte As (SELECT col1 FROM ctetable ) MERGE table1 AStargetUSING finalCte AS source ON (target.ID = source.COL1)WHENMATCHEDTHENUPDATESET target.ID = source.Col1WHENNOTMATCHEDTHENINSERT (ID, col1) VALUES (source.COL1, source.COL1 );