Oracle SQL:将数据更新15%

时间:2015-05-31 05:52:53

标签: sql oracle data-modeling

我正在尝试更新库存增加15%的商品的库存价格。下面是我创建表的代码(我已经插入了所有数据):

CREATE TABLE Warehouse
(WarehouseID CHAR(3),
 LocationCity VARCHAR2(25) NOT NULL,
 LocationState CHAR(3) NOT NULL,
 CONSTRAINT Warehouse_WarehouseID_PK PRIMARY KEY (WarehouseID),
 CONSTRAINT Warehouse_WarehouseID_CC CHECK (UPPER(WarehouseID) IN ('MEL', 'SYD', 'BNE', 'HBA', 'ADL', 'PER', 'DIA')),
 CONSTRAINT Warehouse_LocationState_CC CHECK (UPPER(LocationState) IN ('QLD', 'NSW', 'VIC',  'TAS',  'ACT',  'SA',  'WA',  'NT'))
);

CREATE TABLE Stock
(StockNo CHAR(4),
 StockDesc VARCHAR2(50) NOT NULL,
 UnitsOnHand NUMERIC DEFAULT 0 NOT NULL,
 ItemCategory CHAR(2),
 UnitCost NUMERIC(4,2) DEFAULT 0.00 NOT NULL,
 ReorderLevel NUMERIC(2) DEFAULT 0 NOT NULL,
 CONSTRAINT Category_StockNo_PK PRIMARY KEY (StockNo),
 CONSTRAINT Category_ItemCategory_FK FOREIGN KEY (ItemCategory) REFERENCES "CATEGORY"(CategoryID),
 CONSTRAINT Category_StockDesc_UK UNIQUE (StockDesc),
 CONSTRAINT Category_UnitCost_CC CHECK (UnitCost BETWEEN 0.00 AND 9999.99),
 CONSTRAINT Category_ReorderLevel_CC CHECK (ReorderLevel BETWEEN -1 AND 99)
);

以下是将价格更新15%(单独的工作空间)的当前代码:

UPDATE Stock
SET Stock.UnitCost = (Stock.UnitCost * 1.15)
WHERE Warehouse.WarehouseID = 'MEL';

它出现了这个错误:

Error at Command Line : 3 Column : 7 Error report - SQL Error:  
ORA-00904: "WAREHOUSE"."WAREHOUSEID": invalid identifier  
00904. 00000 -  "%s: invalid identifier"  
*Cause:     
*Action:  

1 个答案:

答案 0 :(得分:3)

目前,您与Stock和Warehouse之间没有任何关系。如果没有已定义的关系,则无法使用另一个表中的条件更新一个表。

如果任何给定的库存物品只存放在一个仓库中,您只需将WarehouseID添加到STOCK表即可。在这种情况下,您的更新将是:

UPDATE stock s
SET s.UnitCost = (s.UnitCost * 1.15)
WHERE s.WarehouseID = 'MEL'
;

更有可能库存项目可以存放在多个仓库中,在这种情况下,您需要第三个表格。该表将存储每个仓库中的库存量。

create table warehouse_stock ( 
   WarehouseID CHAR(3) not null,
   StockNo CHAR(4) not null,
   UnitsOnHand NUMERIC DEFAULT 0 NOT NULL,
    constraint warehouse_stock_pk primary key (WarehouseID, StockNo),
    constraint warehouse_stock_warehouse_fk foreign key (WarehouseID)
        references warehouse(warehouseID),
    constraint warehouse_stock_stock_fk foreign key (StockNo)
        references stock(stockNo)
)

请注意,您需要从STOCK表中删除列UnitsOnHand,因为它不属于那里。在不同仓库之间分配这些中央库存量是留给读者的练习。

现在您的更新将是:

UPDATE stock s
SET s.UnitCost = (s.UnitCost * 1.15)
WHERE s.stockno in ( select ws.stockno from Warehouse ws
                     where .ws.WarehouseID = 'MEL')
;