#sql #stored-procedures #google-bigquery
#sql #хранимые процедуры #google-bigquery
Вопрос:
Я хотел бы, чтобы моя хранимая процедура, которая удаляет и вставляет новые данные из промежуточной таблицы (от 1 до 1), проверяла, имеют ли последние данные значения «HEB» и «Kroger» для столбца «Поставщик» перед выполнением.
Для столбца «Поставщик» может быть больше этих значений, но это нормально (поэтому нормально, если есть значения «HEB», «Kroger» и «Walmart», потому что он содержит Kroger и HEB). Я хочу, чтобы эта проверка данных выполнялась так, чтобы данные из промежуточной таблицы не добавлялись, если поставщики не ВКЛЮЧАЮТ «HEB» и «KROGER».
Это то, что у меня есть до сих пор, но это не удается из-за того, что есть другие поставщики, кроме HEB и Kroger.
Любая помощь приветствуется! Спасибо.
BEGIN
SELECT count(distinct(provider)) as count_provider FROM GroceryStore
where collection_Date = (select max(collection_date) from GroceryStore)
and provider = "HEB" or provider = "Kroger";
if (count_provider = 2) then
delete from target_table where 1=1;
insert into target_table(select * from GroceryStore);
#insert data into log table
insert into Log_Table (select CURRENT_TIMESTAMP() as updated_timestamp,
"GroceryStoreProcessing" as procedure_name, "Success" as log_message);
--insert data into data refresh table
delete from `last_refresh` where 1=1;
insert into `last_refresh` (select CURRENT_TIMESTAMP() as updated_timestamp) ;
else
--insert log for incomplete results - canceled import
#insert data into log table
insert into log_table (select CURRENT_TIMESTAMP() as updated_timestamp,
"GroceryStoreProcessing" as procedure_name, "Failed" as log_message);
return;
End if;
END
--sample source table
date provider
----------------
11-17-20 Kroger
11-17-20 HEB
11-17-20 Walmart
Комментарии:
1.
DISTINCT
это не функция, это заданный квантификатор . Пропустите эти дополнительные скобки и просто напишитеcount(distinct provider)
, чтобы сделать код более понятным.2. Oracle или SQL Server? Пожалуйста, помечайте только соответствующие СУБД.
3. @DaleK Мой вопрос касается оператора IF, который используется с Oracle, SQL server и Big Query.
Ответ №1:
Это мое предположение относительно того, что вы хотите.
DECLARE @collection_date_max date -- use the matching datatype here
SELECT @collection_date_max = max(collection_date) from GroceryStore
IF EXISTS(SELECT * FROM GroceryStore
WHERE collection_Date = @collection_date_max AND [provider] = 'HEB')
AND EXISTS(SELECT * FROM GroceryStore
WHERE collection_Date = @collection_date_max AND [provider] = 'Kroger')
BEGIN
delete target_table
insert target_table
select *
from GroceryStore
insert into Log_Table(updated_timestamp, [procedure_name], log_message)
values(CURRENT_TIMESTAMP, 'GroceryStoreProcessing', 'Success')
...
END ELSE BEGIN -- cancel import
END
Я только что заметил ваш ответ о том, что вы ORACLE. Я ориентирован на SQL Server, но я уверен, что EXISTS переведет.