I am new to snowflake and I am trying to copy data from a view into an existing table
the below CTEs does some processes my data but when I try to copy the output view into a table I get Unexpected insert
with LD as(
select "ID",
"Value",
"Set",
ROW_NUMBER()OVER ( PARTITION BY "ID" order by "Set" desc ) as rownum
from "Archive"."Prty" l
where l."Prty" = 'Log' AND "ID"= 111
),
LD2 as (
select "ID",
"Value",
"Set",
ROWNUM
from LD where ROWNUM = 1
)
---- copy view into table -------
INSERT INTO "v1" ("ID", "Value","Set",ROWNUM )
SELECT * FROM LD2
After much research, I discovered that the insert statement should be at the top and select at the bottom
INSERT INTO "v1" ("ID", "Value","Set",ROWNUM )
with LD as(
select "ID",
"Value",
"Set",
ROW_NUMBER()OVER ( PARTITION BY "ID" order by "Set" desc ) as rownum
from "Archive"."Prty" l
where l."Prty" = 'Log' AND "ID"= 111
),
LD2 as (
select "ID",
"Value",
"Set",
ROWNUM
from LD where ROWNUM = 1
)
SELECT * FROM LD2
You answer is correct the reason is the instruction is
INSERT INTO X SELECT
which is the same as
INSERT INTO X (SELECT)
and the WITH CLAUSE is a pre-fix to a SELECT, thus second form
INSERT INTO X (WITH y SELECT)
You can see this also happen with things like recursive CTE's which expect the first item to be the recursive CTE but if you want a "prior CTE" you end up having the form
WITH cte_a as (
-- body of cte_a
), cte_b as(
WITH recursive_cte as(
-- body of recursive that uses cte_a
)
SELECT * FROM recursive_cte
)
SELECT * from cte_b
This is works, is somewhat ugly, but there we are, there are patterns that the parser expects, and they must be confirmed to.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.