0

我有一张桌子。

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应该正确计算(例如book_id,两个仓库的价格相同)。我怎样才能做到这一点?

升级版:

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

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 */
4

3 回答 3

1
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 为可更新的。我无法测试。

于 2013-03-26T16:40:43.270 回答
1

我认为你应该对INNER JOIN你的SELECT陈述做一个:

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 相同)并像这样工作:

更新前:

---- --------- ------- ---------- --------
| 编号 | book_id | wh_id | 数量 | 价格 |
 ---- --------- ------- ---------- --------
| 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 |
 ---- --------- ------- ---------- --------

更新后:

---- --------- ------- ---------- --------
| 编号 | book_id | wh_id | 数量 | 价格 |
 ---- --------- ------- ---------- --------
| 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 |
 ---- --------- ------- ---------- --------

我希望这是你想要的。祝你好运!

于 2013-03-26T16:49:46.507 回答
1

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

如果您在仓库 1 中有 book_id = 1,价格 = 1.00 美元,而在仓库 2 中有 book_id = 1,价格 = 1.05 美元,此约束将阻止您将图书从一个仓库移动到另一个仓库,同时保持原始价格。

必须付出一些东西。

于 2013-03-26T17:00:15.650 回答