Вставка нескольких таблиц Snowflake с использованием when и подзапросов для значений, которых нет в целевой таблице

#sql #snowflake-cloud-data-platform

Вопрос:

Мне нужно параллельно вставлять в несколько таблиц, где каждая таблица должна добавлять значения, которые не существуют, и пропускать другие значения. Сейчас я тестирую одну таблицу, используя этот запрос:

 INSERT ALL 
WHEN
  (
(
    SELECT
      PKEY 
    FROM
      TEMP) NOT IN ID
  )
THEN
  INTO TEMP (PKEY, TITLE) 
  VALUES
    (
      ID, TITLE_NAME
    )
    SELECT
      $1 AS ID,
      $2 AS TITLE_NAME 
    FROM
      @azure_stg/mti_test.csv (FILE_FORMAT => 'csv');
 

Каждая таблица имеет свои собственные значения, которые следует добавить, чтобы when предложение было полностью отличным от другого.

Ошибка, которую я получаю при выполнении этого запроса, выглядит следующим образом:

Ошибка компиляции SQL: неподдерживаемый тип подзапроса не может быть оценен

Синтаксис временной таблицы:

 create or replace temporary table temp (pkey number, title varchar(32));
 

Файл CSV содержит 1101 строку с простыми случайно сгенерированными идентификаторами и заголовками.

Я пытался использовать:

 INSERT ALL 
WHEN 
  ID NOT IN ( SELECT PKEY FROM TEMP) 
THEN
  INTO TEMP (PKEY, TITLE) 
  VALUES
    (
      ID, TITLE_NAME
    )
    SELECT
      $1 AS ID,
      $2 AS TITLE_NAME 
    FROM @azure_stg/mti_test.csv (FILE_FORMAT=>'GENERIC_CSV_FORMAT');
 

И получил следующую ошибку:

Внутренняя ошибка выполнения SQL: обработка прервана из-за ошибки 300010

Я также проверил эту ссылку на использование вставки по всем таблицам с разными условиями when

Обновить

Я использовал этот запрос:

 INSERT ALL 
  WHEN 
    (SELECT COUNT($1) FROM @AZURE_BLOB_ONA/mti_test.csv (FILE_FORMAT=>'GENERIC_CSV_FORMAT') WHERE $1 NOT IN (SELECT PKEY FROM TEMP))>0
  THEN
  INTO TEMP (PKEY, TITLE) 
  VALUES
    (
      ID, TITLE_NAME
    )
    SELECT
      $1 AS ID,
      $2 AS TITLE_NAME 
    FROM @azure_stg/mti_test.csv (FILE_FORMAT=>'GENERIC_CSV_FORMAT');
 

Это сработало, но теперь мне нужно добавить еще один подзапрос в основную вставку, чтобы исключить дублирование.

Ответ №1:

Синтаксис NOT IN — это [значение], КОТОРОГО НЕТ В [подзапросе], а не наоборот.

https://docs.snowflake.com/en/sql-reference/functions/in.html

Пожалуйста, попробуйте

 INSERT ALL 
WHEN 
  ID NOT IN ( SELECT PKEY FROM TEMP) 
THEN
  INTO TEMP (PKEY, TITLE) 
  VALUES
    (
      ID, TITLE_NAME
    )
    SELECT
      $1 AS ID,
      $2 AS TITLE_NAME 
    FROM
      @azure_stg/mti_test.csv (FILE_FORMAT => 'csv');
 

Комментарии:

1. забыл упомянуть, что я попробовал это и получил следующую ошибку: SQL execution internal error: Processing aborted due to error 300010:1094633624; incident 4995280.

2. Попробуйте, КОГДА НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ PKEY ИЗ TEMP, ГДЕ PKEY = ID) пожалуйста 🙂

3. все та же ошибка, однако проверьте этот запрос, который сработал. INSERT ALL WHEN (SELECT COUNT($1) FROM @AZURE_BLOB_ONA/mti_test.csv (FILE_FORMAT=>'GENERIC_CSV_FORMAT') WHERE $1 NOT IN (SELECT PKEY FROM TEMP))>0 THEN INTO TEMP (PKEY, TITLE) VALUES ( ID, TITLE_NAME ) SELECT $1 AS ID, $2 AS TITLE_NAME FROM @AZURE_BLOB_ONA/mti_test.csv (FILE_FORMAT=>'GENERIC_CSV_FORMAT');

4. проверьте часть обновления моего вопроса