#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 будут повторяющиеся значения […]. Я хочу избежать дублирования либо с помощью слияния, либо обновления, либо любым другим методом»
- «ПЕРЕЗАПИСЬ ВСТАВКИ заменяет строки таблицы, когда я вызывал процедуру в двух разных столбцах таблицы»
Затем, если вы не хотите вставлять повторяющиеся значения в существующую таблицу, вы можете сделать что-то вроде этого:
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. Интересно: почему вы ожидаете таблицу с миллионами строк для такого случая — у вас каким-то образом будут миллионы разных имен столбцов таблицы?