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、2つの倉庫で同じ価格を引き上げるなど)。どうやってやるの?

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 */
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と同じかもしれないと思います)、次のように動作しました。

更新前:

---- --------- ------- ---------- -------
| id | 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 |
 ---- --------- ------- ---------- -------

更新後:

---- --------- ------- ---------- -------
| id | 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 に答える