Хранимая процедура для проверки наличия значений

#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 переведет.