1

假设我有两张桌子:orderinfocustomerinfo

它们看起来像这样:

订单信息:

OrderID
CustomerID
OrderCustomerName
OrderCustomerAddress

顾客信息:

CustomerID
CustomerName
CustomerAddress

两者都是独一无二的OrderIDCustomerID当要创建订单时,我需要将信息从 customerinfo 复制到 orderinfo,因为客户以后可能会更改他的信息。

我希望我可以用它CustomerID 来实现这一点。我应该如何编写子查询?谢谢。

4

3 回答 3

2

当您插入新订单时,您可以使用以下简单的INSERT...SELECT查询语法获取客户数据的“快照” :

INSERT INTO orderinfo (CustomerID, OrderCustomerName, OrderCustomerAddress, status) 
SELECT CustomerID, CustomerName, CustomerAddress, 'P'
FROM customerinfo
WHERE CustomerID = <customerid here>

这会在下订单的确切时间插入带有客户信息的新订单。

即使客户在表中更新他或她的信息,此信息仍将保持其插入方式,因为除了更改(它不应该发生变化,即使它确实发生了变化,它也不应该)customerinfo之外没有任何级联效应CustomerID不会更改“快照”数据)。

于 2012-07-08T23:04:53.820 回答
1

要使用orderinfo基于 a 的客户姓名和地址的当前值进行更新CustomerID,请使用 a UPDATE JOIN

UPDATE
  orderinfo
  JOIN customerinfo ON orderinfo.CustomerID = customerinfo.CustomerID
SET 
  OrderCustomerName = CustomerName,
  OrderCustomerAddress = CustomerAddress
WHERE OrderID = <some_order_id>

如果您想“冻结”与特定订单关联的客户信息,即使客户稍后在全局范围内更改该信息,这也很有用。如果我理解正确,那是你的意图。

您也可以使用桌子AFTER INSERT上的触发器来执行此操作。orderinfo然后您无需执行单独的查询:

CREATE TRIGGER update_order_cust_info AFTER INSERT ON orderinfo
FOR EACH ROW 
BEGIN
    UPDATE
      orderinfo
      JOIN customerinfo ON orderinfo.CustomerID = customerinfo.CustomerID
    SET 
      NEW.OrderCustomerName = CustomerName,
      NEW.OrderCustomerAddress = CustomerAddress
    WHERE OrderID = NEW.OrderID
END
于 2012-07-08T22:56:20.360 回答
1

你正在寻找的是

INSERT INTO orderinfo 
    (OrderID, CustomerID, OrderCustomerName, OrderCustomerAddress)
VALUES (
    '12345', 
    '789',
    (SELECT CustomerName FROM customerinfo WHERE CustomerID = '789'),
    (SELECT CustomerAddress FROM customerinfo WHERE CustomerID = '789')
)

但我强烈建议您更改数据库结构。您尝试执行的操作违反了数据库规范化规则。相反,请阅读 Wikipedia 上关于慢慢变化的维度的这篇文章,并按此方式实现它。

于 2012-07-08T22:58:55.533 回答