1

私が2つのテーブルを持っているとしましょう:orderinfoそしてcustomerinfo

彼らはこのように見えます:

orderinfo:

OrderID
CustomerID
OrderCustomerName
OrderCustomerAddress

customerinfo:

CustomerID
CustomerName
CustomerAddress

OrderIDとの両方CustomerIDがユニークです。注文を作成するときは、顧客が後で情報を変更する可能性があるため、その時点で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に基づいて顧客の名前と住所の現在の値で更新するには、 :CustomerIDを使用します。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')
)

ただし、データベース構造を変更することを強くお勧めします。あなたがしようとしていることは、データベースの正規化規則に違反しています。代わりに、ウィキペディアの緩やかに変化する次元に関するこの記事を読んで、そのように実装してください。

于 2012-07-08T22:58:55.533 に答える