2014-10-31 48 views
0

我正在使用SQL服务器,而我正在尝试做的是创建一个触发器,每当ShipDate(从表“OrderHeader”)将QtyOnHand(从表“book”)减1从NULL更新为实际日期。SQL - 连接触发器中的表

正如你从下面的表格中看到的,OrderHeader和Book不是直接相关的,我必须通过OrderHeader的OrderDetail表来获取书的ISBN,然后从Book表中减去QtyOnHand, ISBN。

我试图加入触发器中的所有3个表来比较OrderNo,ISBN和QtyOnHand进行比较,但我不确定这是否是解决此问题的正确方法。

任何建议,将不胜感激。谢谢

OrderHeader

+-----------+---------+------+-----+ 
| Name  | Type | Null | Key | 
+-----------+---------+------+-----+ 
| OrderNo | int  | NO | PRI | 
| MemberID | char(10)| NO |  |  
| OrderDate | date | NO |  | 
| Address | char(30)| NO |  | 
| ShipDate | date | YES |  | 
+-----------+---------+------+-----+ 

的OrderDetail

+-----------+---------+------+-----+ 
| Name  | Type | Null | Key | 
+-----------+---------+------+-----+ 
| OrderNo | int  | NO | PRI | 
| OrderLine | int  | NO | PRI |  
| ISBN  | char(10)| NO |  | 
| Quantity | int  | NO |  | 
| Price  | decimal | NO |  | 
+-----------+---------+------+-----+ 

+-----------+---------+------+-----+ 
| Name  | Type | Null | Key | 
+-----------+---------+------+-----+ 
| ISBN  | char(10)| NO | PRI | 
| Author | char(50)| NO |  |  
| Title  | char(80)| NO |  | 
| QtyOnHand | int  | NO |  | 
| Price  | decimal | YES |  | 
+-----------+---------+------+-----+ 
+0

当然不是正确的方法。当您的应用程序将订单标记为已发货时,应该减少库存。 – 2014-10-31 20:33:48

回答

0

我会做这样的事情,还没有运行该查询可能有一些语法错误,

MERGE Book As Target 
USING (Select OH.ISBN FROM OrderHeader OH 
Inner join OrderDetail OD 
ON OH.OrderNo = OD.OrderNo 
Where OD.ShipDate IS NOT NULL) AS Source 
ON Source.ISBN = Target.ISBN 
WHEN MATCHED THEN 
    UPDATE 
    SET Target.QtyOnHand = Target.QtyOnHand + 1;