繁体   English   中英

用于数据迁移的SQL查询

[英]SQL query for data migration

我有桌子

CREATE TABLE StockItem
(
    id        NUMBER(8) NOT NULL,
    book_id   NUMBER(8) NOT NULL,
    wh_id     NUMBER(8) NOT NULL,
    quantity  NUMBER(4) NOT NULL,
    price     NUMBER(8,2) NOT NULL
);

ALTER TABLE StockItem
    ADD CONSTRAINT UQ_StockItem UNIQUE (book_id, wh_id);
ALTER TABLE StockItem ADD CONSTRAINT PK_StockItem 
    PRIMARY KEY (id);
ALTER TABLE StockItem ADD CONSTRAINT FK_StockItem_Book 
    FOREIGN KEY (book_id) REFERENCES Book (id);
ALTER TABLE StockItem ADD CONSTRAINT FK_StockItem_Warehouse 
    FOREIGN KEY (wh_id) REFERENCES Warehouse (id);

现在假设wh_id = 1关闭,我应该将所有书籍移至wh_id = 2 wh_id = 2书籍价格应与wh_id = 1书籍价格相同,并且quantity应正确计算(例如,对于两个washouse,相同book_id书籍价格应提高)。 我怎样才能做到这一点?

UPD:

这是我如何获取书籍的新数量值的方法。

SELECT BOOK_ID, SUM(QUANTITY) 
FROM STOCKITEM
WHERE WH_ID IN (1, 2)
GROUP BY BOOK_ID;

现在,我应该以某种方式更新它们。

UPDATE STOCKITEM
SET QUANTITY = /* My summed quantity */
WHERE BOOK_ID = /* Book ids from 1 and 2 wh */
UPDATE (SELECT SI2.quantity AS qty2, SI2.price as p2, SI1.quantity as qty1, SISI1.price as p1
        FROM   StockItem SI2 INNER JOIN StockItem SI1 
        ON     (SI2.book_id = SI1.book_id)
        WHERE  SI2.wh_id = 2 AND SI1.wh_id = 1) WH
SET WH.qty2 = WH.qty2 + WH.qty1,
    WH.p2 = WH.p1

该答案基于在Oracle具有内部连接的Update语句,并且它要求Oracle接受WH作为可更新。 我无法测试。

我认为您应该使用SELECT语句进行INNER JOIN

UPDATE stockItem 
INNER JOIN (SELECT book_id, SUM(quantity) AS total 
            FROM stockItem WHERE wh_id IN (1, 2)
            GROUP BY book_id) AS qntyBooks 
  ON qntyBooks.book_id = stockItem.book_id 
SET 
  stockItem.quantity = qntyBooks.total, 
  stockItem.wh_id = 2; -- all wh_id in 1, 2 will change to 2

我在MySQL上进行了测试(我认为可能与Oracle11g相同),并且像这样工作:

更新之前:

---- --------- ------- ---------- ------- 
| id | book_id | wh_id | quantity | price |
 ---- --------- ------- ---------- ------- 
|  1 |       1 |     1 |        3 |    10 |
|  2 |       2 |     1 |        3 |    20 |
|  3 |       3 |     1 |        3 |    30 |
|  4 |       1 |     2 |        2 |    40 |
|  5 |       2 |     2 |        2 |    50 |
 ---- --------- ------- ---------- -------

更新后:

---- --------- ------- ---------- ------- 
| id | book_id | wh_id | quantity | price |
 ---- --------- ------- ---------- ------- 
|  1 |       1 |     2 |        5 |    10 |
|  2 |       2 |     2 |        5 |    20 |
|  3 |       3 |     2 |        3 |    30 |
|  4 |       1 |     2 |        5 |    40 |
|  5 |       2 |     2 |        5 |    50 |
 ---- --------- ------- ---------- -------

希望这就是您想要的。 祝好运!

使用当前的数据库设计,您做不到。 原因是CONSTRAINT UQ_StockItem UNIQUE(book_id,wh_id)。

如果在仓库1中,book_id = 1,价格= $ 1.00,在仓库2中,book_id = 1,价格= $ 1.05,在仓库2中,此约束将阻止您在保持原始价格的情况下将书籍从一个仓库移动到另一个仓库。

一定要给的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM