Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
触发器中的SQL连接表_Sql_Sql Server - Fatal编程技术网

触发器中的SQL连接表

触发器中的SQL连接表,sql,sql-server,Sql,Sql Server,我使用的是SQL server,我正在尝试创建一个触发器,每当表OrderHeader中的ShipDate从NULL更新为实际日期时,该触发器将从表book中减量QtyOnHand 1 从下表中可以看出,OrderHeader和Book之间没有直接的关系,我必须从OrderHeader中遍历OrderDetail表,以获得书籍的ISBN,然后从具有相应ISBN的Book表中手动递减QT 我尝试在触发器中连接所有3个表来比较OrderNo、ISBN和QtyOnHand以进行比较,但我不确定这是否是

我使用的是SQL server,我正在尝试创建一个触发器,每当表OrderHeader中的ShipDate从NULL更新为实际日期时,该触发器将从表book中减量QtyOnHand 1

从下表中可以看出,OrderHeader和Book之间没有直接的关系,我必须从OrderHeader中遍历OrderDetail表,以获得书籍的ISBN,然后从具有相应ISBN的Book表中手动递减QT

我尝试在触发器中连接所有3个表来比较OrderNo、ISBN和QtyOnHand以进行比较,但我不确定这是否是解决此问题的正确方法

如有任何建议,将不胜感激。多谢各位

订单头

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

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


我会这样做,没有运行查询,可能有语法错误

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;

当然不是正确的方式。当应用程序将订单标记为已发货时,应该减少库存。
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;