#join #merge #null #snowflake-cloud-data-platform #primary-key
Вопрос:
У меня есть две таблицы в соответствии с приведенной ниже структурой в базе данных SNOWFLAKE, и я пытаюсь объединить данные из промежуточной таблицы в две нижеприведенные таблицы.
Первичный ключ таблицы DIM_PRODUCTS ниже-PRODUCTID
Первичным ключом таблицы PRODUCTSDETAIL является PRODUCTSDETAILID, а идентификатор КЛИЕНТА генерируется в stagingtbale с помощью nextval
Я понимаю, что если я создам таблицу со ссылкой на внешний ключ, то значения должны автоматически заполняться для этого столбца, если найдены соответствующие имена, но в моем случае он показывает нулевые значения.
Ниже приведен синтаксис, который я использовал для создания таблицы DIM_PRODUCT и таблицы PRODUCTSDETAIL
create or replace TABLE DIM_PRODUCT cluster by (PRODUCTID)( PRODUCTID NUMBER(38,0) NOT NULL autoincrement, PRODUCTName VARCHAR(), primary key (PRODUCTID) ); Create table PRODUCTSDETAIL( ProductsdetailID NUMBER(38,0) NOT NULL autoincrement, CUSTOMERID NUMBER(38,0), PRODUCTID NUMBER(38, 0), PRODUCTunit varchar(255), PRODUCTname varchar(255), PRODUCTcode varchar(255), PRODUCTquantity varchar(255), PURCHASEdate TIMESTAMP_NTZ(9), foreign key (PRODUCTID) references test."manufacturer".dim_product(PRODUCTID))
Ниже приведен оператор слияния, который я использовал для загрузки данных в таблицу сведений и получил нулевые значения для PRODUCTID
merge into PRODUCTDETAILS as a using ( select CUSTOMERID, f.value as Productunit, Productname[f.index]::Varchar as Productname, Productcode [f.index]::Varchar as Productcode, Productquantity [f.index]::Varchar as Productquantity, PURCHASEDate [f.index]::Timestamp as PURCHASEDate from staging_json b LATERAL FLATTEN(Productunit, RECURSIVE=gt;true)f) as b on a.PURCHASEDate = b.PURCHASEDate and a.Productcode = b.Productcode and a.CUSTOMERID = b.CUSTOMERID and a.Productquantity = b.Productquantity when not matched then insert (CUSTOMERID, PRODUCTID, Productunit, Productname, Productcode,Productquantity, PURCHASEDate) values (CUSTOMERID, PRODUCTID, Productunit, Productname, Productcode,Productquantity, PURCHASEDate)
Я также создал последовательности для автоматического создания для ProductID и ProductdetailID
Я также попробовал подход объединения для заполнения ProductID, но это не сработало, и код для этого, как показано ниже
merge into PRODUCTDETAILS as a using ( select CUSTOMERID, f.value as Productunit, Productname[f.index]::Varchar as Productname, Productcode [f.index]::Varchar as Productcode, Productquantity [f.index]::Varchar as Productquantity, PURCHASEDate [f.index]::Timestamp as PURCHASEDate from staging_json b LEFT JOIN DIM_PRODUCTS c ON c.PRODUCTNAME = a.PRODUCTNAME, LATERAL FLATTEN(Productunit, RECURSIVE=gt;true)f) as b on a.PURCHASEDate = b.PURCHASEDate and a.Productcode = b.Productcode and a.CUSTOMERID = b.CUSTOMERID and a.Productquantity = b.Productquantity when not matched then insert (CUSTOMERID, PRODUCTID, Productunit, Productname, Productcode,Productquantity, PURCHASEDate) values (CUSTOMERID, PRODUCTID, Productunit, Productname, Productcode,Productquantity, PURCHASEDate)
Я пытаюсь найти хорошую практику, чтобы загрузить PRODUCTID в таблицу PRODUCTSDETAIL и сделать ее согласованной для запросов. Кто-нибудь, пожалуйста, может мне помочь?
Комментарии:
1. Я не вижу, чтобы вы извлекли PRODUCTID из таблицы staging_json после выравнивания. Пожалуйста, дважды проверьте свой запрос.
2. Я голосую за то, чтобы закрыть этот вопрос, потому что пользователь дважды поднимал один и тот же вопрос