#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));
Если у вас есть дополнительные атрибуты, описывающие продукт, их следует изменить внутри СЛИЯНИЯ.