1

How WHEN clause evaluate values of columns in order to insert only new values and skip existing ones when using the following query:

INSERT ALL
WHEN (SELECT COUNT(*) FROM DEST WHERE DEST.ID = NEW_ID) = 0 THEN
INSERT INTO DEST (ID) VALUES (NEW_ID)
SELECT NEW_ID FROM SRC

I tried with WHEN NEW_ID NOT IN (SELECT...) THEN

But it didn't work and threw an error of unsupported.

Does it create a virtual column in all rows with values of true or false and then add all rows having true as a result?

alim1990
  • 4,656
  • 12
  • 67
  • 130

1 Answers1

0

Using EXISTS:

INSERT ALL
WHEN NOT EXISTS (SELECT 1 FROM DEST WHERE DEST.ID = NEW_ID) THEN
INTO DEST (ID) VALUES (NEW_ID) 
SELECT NEW_ID FROM SRC;

Sample data:

CREATE TABLE DEST(ID INT);
INSERT INTO DEST VALUES(1);

CREATE TABLE SRC(NEW_ID INT);
INSERT INTO SRC VALUES (1),(2);


SELECT * FROM DEST;
-- 1

--EXPLAIN USING TABULAR
INSERT ALL
WHEN NOT EXISTS (SELECT 1 FROM DEST WHERE DEST.ID = NEW_ID) THEN
INTO DEST (ID) VALUES (NEW_ID) 
SELECT NEW_ID FROM SRC;


SELECT * FROM DEST;
-- 1
-- 2
Lukasz Szozda
  • 162,964
  • 23
  • 234
  • 275
  • How does work ? Does when filter rows to new ones to be later added ? – alim1990 Nov 16 '21 at 17:37
  • 1
    @alim1990 The internals are probably known only to Snowflake engineers. Some hints could be seen using `EXPLAIN USING TABULAR`. " Does when filter rows to new ones to be later added ?" - Each WHEN is independent when INSERT ALL is used – Lukasz Szozda Nov 16 '21 at 17:47