2013-03-26 62 views
0

我有一张表。用于数据迁移的SQL查询

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 = 2wh_id = 2的预订价格应与wh_id = 1quantity的计算价格相同(例如,对于两个连栋房屋,相同的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 */ 
+0

Oracle 11g数据库。 – 2013-03-26 16:12:25

+0

更新后,所以你可以看到我的尝试。 – 2013-03-26 16:17:02

+0

这是你在找什么?你把你的'BOOK_ID'拼音化,并用计数来更新它。 'UPDATE STOCKITEM SET QUANTITY =(SELECT COUNT(*)FROM STOCKITEM WHERE BOOK_ID = yourBookId)WHERE BOOK_ID =/* Book 1和2的id * /' – 2013-03-26 16:22:28

回答

1

我想你应该有你的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 | 
---- --------- ------- ---------- ------- 

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

+0

Oracle不支持UPDATE语句中的INNER JOINs查找解决方案来替换这个语句谢谢 – 2013-03-26 17:14:41

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 

这个答案是基于Update statement with inner join on Oracle,它需要Oracle接受WH为可更新。我无法测试。

+0

这种语法在Oracle中不起作用 – 2013-03-26 17:58:00

+0

我修改了SQL代码 – koriander 2013-03-26 22:30:38

+0

谢谢,我已经实现了它 – 2013-03-27 15:19:17

1

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

如果您在仓库1中的price = $ 1.00,book_id = 1在仓库2中的price = $ 1.05时有book_id = 1,则此限制将阻止您在保持原始价格的同时将图书从一个仓库移动到另一个仓库。

有些事情要付出。

+0

我应该从仓库#1中设定价格,并忘记原来在#2中的价格,我不必保持这两个价格。 – 2013-03-26 17:12:42