Вставить выписку с вычисляемым столбцом - PullRequest
0 голосов
/ 23 января 2019

Я создал следующие простые DataModel:

enter image description here

Я использовал следующие insert statements для вставки значений:

1) Таблица Продукты :

INSERT INTO test.products
(ProductName, Price)
VALUES 
("Product A","99,99"),
("Product B","49,95"), 
("Product C","5,95");

2) Таблица Заказы :

INSERT INTO test.orders
(Customer)
VALUES 
("Customer A"),
("Customer B"), 
("Customer B");

Пока все это прекрасно работает.


Теперь в таблице Products_per_Order я хочу вычислить последний столбец OrderValue, умножив Price на Quantity.Поэтому я попытался воспользоваться следующими двумя вариантами, ссылаясь на ответы здесь , но пока не смог заставить их работать:

Примечание: Столбец Priceполучение цены на основе idProduct из таблицы Products.
Эта функциональность уже работает.Не работает только умножение на количество.

Опция 1:

INSERT INTO test.products_per_order
(Orders_idOrders, Products_idProducts, Price, Quantity, OrderValue)
VALUES
("1","1",(Select Price from test.products where test.products.idProducts = "1"),"5",(Price * Quantity)),
("1","2",(Select Price from test.products where test.products.idProducts = "2"),"4",(Price * Quantity)),
("2","1",(Select Price from test.products where test.products.idProducts = "1"),"10",(Price * Quantity)),
("3","2",(Select Price from test.products where test.products.idProducts = "2"),"3",(Price * Quantity)),
("3","3",(Select Price from test.products where test.products.idProducts = "3"),"9",(Price * Quantity));

Опция 2:

INSERT INTO test.products_per_order 
(Orders_idOrders, Products_idProducts, Price, Quantity, OrderValue)
    SELECT m.idOrder, m.idProduct, p.price, m.qty, p.price * m.qty
    FROM (SELECT 1 as idOrder, 1 as idProduct, 5 as qty UNION ALL
          SELECT 1 as idOrder, 2 as idProduct, 4 as qty UNION ALL
          SELECT 2 as idOrder, 1 as idProduct, 10 as qty UNION ALL
          SELECT 3 as idOrder, 2 as idProduct, 3 as qty UNION ALL
          SELECT 3 as idOrder, 3 as idProduct, 9 as qty
         ) m
    LEFT JOIN test.products p on p.idProducts = m.idProduct;

У вас есть идеи, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Что касается комментариев ниже, вопрос заключается в том, что prices в таблице Products необходимо хранить, используя . в качестве десятичного разделителя вместо ,

Если выизмените INSERT STATEMENT таблицы Products на:

INSERT INTO test.products
(ProductName, Price)
VALUES 
("Product A","99.99"),
("Product B","49.95"), 
("Product C","5.95");

и запустите код в Опция 2 все работает.

INSERT INTO test.products_per_order 
(Orders_idOrders, Products_idProducts, Price, Quantity, OrderValue)
    SELECT m.idOrder, m.idProduct, p.price, m.qty, p.price * m.qty
    FROM (SELECT 1 as idOrder, 1 as idProduct, 5 as qty UNION ALL
          SELECT 1 as idOrder, 2 as idProduct, 4 as qty UNION ALL
          SELECT 2 as idOrder, 1 as idProduct, 10 as qty UNION ALL
          SELECT 3 as idOrder, 2 as idProduct, 3 as qty UNION ALL
          SELECT 3 as idOrder, 3 as idProduct, 9 as qty
         ) m
    LEFT JOIN test.products p on p.idProducts = m.idProduct;
0 голосов
/ 23 января 2019

Вы написали, что OrderValue - это вычисляемый столбец, почему бы не позволить базе данных рассчитать его для вас?

Используйте изменить таблицу , чтобы изменить столбец OrderValue на сгенерированный столбец, например:

alter table test.products_per_order 
modify column OrderValue int generated always as (Price * Quantity) stored;

Таким образом, вам вообще не нужно его вставлять - и ваша вставка становится такой:

INSERT INTO test.products_per_order 
(Orders_idOrders, Products_idProducts, Price, Quantity)
    SELECT m.idOrder, m.idProduct, p.price, m.qty
    FROM (SELECT 1 as idOrder, 1 as idProduct, 5 as qty UNION ALL
          SELECT 1 as idOrder, 2 as idProduct, 4 as qty UNION ALL
          SELECT 2 as idOrder, 1 as idProduct, 10 as qty UNION ALL
          SELECT 3 as idOrder, 2 as idProduct, 3 as qty UNION ALL
          SELECT 3 as idOrder, 3 as idProduct, 9 as qty
         ) m
    LEFT JOIN test.products p on p.idProducts = m.idProduct;
...