Как избежать дубликатов в хранимых процедурах в snowflake

#javascript #sql #stored-procedures #snowflake-cloud-data-platform

#javascript #sql #хранимые процедуры #snowflake-cloud-data-platform

Вопрос:

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

Вот моя хранимая процедура:

 CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
    sqlText: "SELECT * FROM "   TABLE_NAME   " LIMIT 1;",    
});
stmt.execute();

var cols=[];
for (i = 1; i <= stmt.getColumnCount(); i  ) {
  INSERT INTO TABLE1 (Col_Name) VALUES (' "stmt.getColumnName(i)" ');  //DUPLICATE VALUES
}
return cols
$$;
  

Редактировать:

Я извлекаю имена столбцов, скажем, из Col_table (Col1, Col2, Col3) , и я хочу, чтобы эти имена столбцов были в TABLE1.

Я вызвал процедуру call get_columns(Col_table) , и имена столбцов вставлены в TABLE1.

Когда я снова вызову процедуру call get_columns(Col_table) , TABLE1 будет иметь повторяющиеся значения как (Col1, Col2, Col3, Col1, Col2, Col3) . Я хочу избежать дублирования либо с помощью слияния, либо обновления, либо любым другим методом.

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

1. Можете ли вы предоставить нам пример ввода и конечный результат? Какова цель процедуры get_columns ?

2. @FelipeHoffa Не могли бы вы взглянуть на мою правку

3. Известно ли вам заранее количество столбцов? Существует ли действительный идентификатор для проверки уникальности записи?

4. @Sujitmohanty30 Я заранее не знаю количество столбцов. Нет действительного идентификатора для проверки уникальности записи. Я хочу избежать дублирования при вставке.

5. @R0bert Я ответил, исходя из желания, чтобы вставка происходила только один раз. Но ваша цель — вызвать этот метод несколько раз в разных таблицах и иметь только разные имена столбцов?

Ответ №1:

На основе отредактированного вопроса и комментариев:

  1. «Когда я снова вызову процедуру […], в таблице 1 будут повторяющиеся значения […]. Я хочу избежать дублирования либо с помощью слияния, либо обновления, либо любым другим методом»
  1. «ПЕРЕЗАПИСЬ ВСТАВКИ заменяет строки таблицы, когда я вызывал процедуру в двух разных столбцах таблицы»

Затем, если вы не хотите вставлять повторяющиеся значения в существующую таблицу, вы можете сделать что-то вроде этого:

 INSERT INTO TABLE1(Col_Name) 
SELECT *
FROM (SELECT 'i' x)
WHERE x NOT IN (SELECT Col_Name FROM TABLE1);
  

Замените этот SQL-код внутри вашей процедуры, и вы не увидите повторяющихся значений. Замените 'i' значение, которое вы хотите вставить.

(в качестве общего комментария: Я не уверен, что процедура в вопросе является наиболее эффективным решением общей заявленной проблемы, но это устранит конкретную проблему наличия повторяющихся строк)

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

1. Я не хочу перезаписывать содержимое в таблицу, но перед добавлением в таблицу назначения я хочу проверить, существует ли строка с одинаковыми значениями .. Если эта строка не существует, я хочу вставить в таблицу, иначе ее нет.

2. INSERT OVERWRITE происходит замена строк таблицы, когда я вызывал процедуру в двух разных столбцах таблицы

3. Спасибо за ответ, но мне интересно, есть ли какой-либо оптимизированный метод для решения этой проблемы, потому что, если таблица содержит несколько миллионов строк, вычисление займет так много времени

4. Интересно: почему вы ожидаете таблицу с миллионами строк для такого случая — у вас каким-то образом будут миллионы разных имен столбцов таблицы?