0

SQL初心者として、私が想定していることは、1つから複数の子レコードについての基本的な質問です。

order テーブルと Order_Status 子テーブルがあります。

Order table
ID    Order_Number    Status    Order_Date    ect

Order_Status table
StatusTo    StatusFrom    Order_ID    StatusChange_Date

子テーブルには、単一の親注文のステータス変更のエンティティを多数含めることができます。

次の情報を、その親 (p) の子テーブル (os) の最新レコードを含む単一のレコードとしてプルバックするにはどうすればよいですか? ( p.Order_Number, p.Status, p.Order_Date, os.StatusTo, os.StatusChange_Date)。

最終的な os.statusto が p.status と一致しないのではないかと懸念しているため、知っておく必要があります。

前もって感謝します!

スティーブ

4

2 に答える 2

0

これでうまくいくと思います。変更があり、変更が記録されたものと異なる場合にのみ気にすることを想定します(変更するのは簡単なはずです)。

WITH Most_Recent_Change (order_id, statusTo, changedAt, rownum) as 
     (SELECT order_id, statusTo, statusChange_date, 
             ROWNUMBER() OVER(PARTITION BY order_id
                              ORDER BY statusChange_date DESC)
      FROM Order_Status)
SELECT Order.order_number, Order.status, Order.order_date, 
       Most_Recent_Change.statusTo, Most_Recent_Change.changedAt
FROM Order
JOIN Most_Recent_Change 
ON Most_Recent_Change.order_id = Order.id
AND Most_Recent_Change.rownum = 1
AND Most_Recent_Change.statusTo <> Order.status

(SQLFiddleの例がありますが、現時点では奇妙な動作をしています)

これを実行するコミットレベルに注意する必要があります。そうしないと、同時に更新される行から誤検知が発生する可能性があります。

その他の注意事項:

  • ORDER識別子に予約語(など)を使用しないでください。それは一般的にただの面倒です
  • 特にこれらの型が将来変更される可能性がある場合は、列にデータ型の接尾辞を付けないでください。このように厳密にorder_date名前が付けられているわけではないことは承知していますが、危険なほど近いものです。おそらく(厳密な「太陽日」タイプの場合)またはそれ以上(タイムスタンプ、UTC、またはタイムゾーン付き)のようなものである必要があります。orderedOnorderedAt
于 2012-08-03T16:05:01.353 に答える
0

最新の注文ステータスを取得するサブクエリに参加できます

例えば

SELECT p.Order_Number, p.Status, p.Order_Date, os.StatusTo, os.StatusChange_Date
FROM ORDER p
LEFT  JOIN (
          SELECT StatusTo,  Order_ID, MAX(StatusChange_Date) as StatusChange_Date
          FROM Order_Status
          GROUP BY StatusTo,    Order_ID
        )  os ON os.Order_ID= p.Order_ID
于 2012-08-03T14:26:03.053 に答える