Инструкция слияния в базе данных SNOWFLAKE об ошибке первичного ключа

#sql #snowflake-cloud-data-platform #primary-key #fact-table #merge-statement

Вопрос:

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

Ниже приведена инструкция merge, в которой я пытаюсь загрузить данные в таблицу продуктов DIM из таблицы JSON, но получаю загруженные значения NULL.

Я делаю что-то не так со слиянием и не должен ли я объединяться по первичному ключу, а вместо этого по полям, таким как имя города

У меня такая же проблема при попытке загрузить данные в таблицу фактов

Не мог бы кто-нибудь, пожалуйста, помочь?

 merge into dim_product as a using (select productID, product from jsontable) as b on b.productID = a.productID when matched then update a.productID = b.productID when not matched then insert (productID, product) values (b.productID, b.product));  

Ниже приведена таблица Существующих продуктов измерения

введите описание изображения здесь

Ниже приведен пример JSON, из которого я пытаюсь объединить и вставить новую запись Mango в мою таблицу DIM, а также заполнить PRODUCTID в мою таблицу фактов

введите описание изображения здесь

Ниже приведена таблица фактов

введите описание изображения здесь

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

1. Это зависит от исходной структуры таблицы ( CREATE TABLE операторов), точных данных ( INSERT операторов), сведений о точном результате MERGE операции и о том, какие именно строки/значения были неожиданными, а также от точного ожидаемого результата. Минимальный воспроизводимый тестовый случай часто имеет решающее значение для решения проблемы без угадывания. Попробуйте обновить вопрос со всеми вышеперечисленными деталями.

2. Привет @JonArmstrong, Спасибо за это, я обновил свой вопрос образцами изображений.

3. Почему вы обновляете первичный ключ, когда вы находите соответствующую строку, вы должны обновлять продукт, а не идентификатор продукта. Я думаю, что ключ в том, как вы извлекаете данные из json, можете ли вы показать, как выглядят эти данные и как вы их извлекаете?

4. В вашей таблице json нет столбца идентификатора продукта. Пожалуйста, ознакомьтесь с таблицами SQL и примерами в своем вопросе и убедитесь, что они согласованы

5. Предоставленный вами запрос не соответствует образцу общих данных. Как уже упоминал Ник, в данных JSON нет идентификатора продукта. Кроме того, нет столбца «продукт», поэтому «выберите ProductID, продукт из jsontable» тоже неверно, он должен включать поле описания. Пожалуйста, исправьте свой вопрос.

Ответ №1:

Если у нас нет ProductID в источнике и мы задаем его только в Dim_Product, мы должны использовать бизнес-ключ. В вашем случае имя продукта-это бизнес-ключ. Решение простое, когда вы выполняете СЛИЯНИЕ, вы должны использовать имя продукта в качестве ключа вместо ProductID.

Ваше СЛИЯНИЕ должно выглядеть примерно так:

 merge into dim_product as a using (select ProductName from jsontable) as b on b.ProductName = a.ProductName when not matched then insert (ProductName) values (b.ProductName));  

Если у вас есть дополнительные атрибуты, описывающие продукт, их следует изменить внутри СЛИЯНИЯ.