2013-03-26 64 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