#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. проверьте часть обновления моего вопроса