0

私のアプリケーションには、変更されたデータのみをログに記録し、他の列を NULL のままにするロギング テーブルがあります。私が今やりたいことは、それらの列 (タイプとステータス) の 2 つを取るビューを作成し、そのログ行のエントリでタイプとステータスを返す結果セットを作成することです。 null になります。

たとえば、次のデータを使用します。

Type Status AddDt

A    1      7/8/2013
NULL 2      7/7/2013
NULL 3      7/6/2013
NULL NULL   7/5/2013
B    NULL   7/4/2013
C    NULL   7/3/2013
C    4      7/2/2013

produce the resultset:
Type Status AddDt
A    1      7/8/2013
A    2      7/7/2013
A    3      7/6/2013
A    3      7/5/2013
B    3      7/4/2013
C    3      7/3/2013
C    4      7/2/2013

そこから、これらの結果で、タイプとステータスが特定の条件 (タイプ B とステータス 3 (2013 年 7 月 4 日) など) を初めて満たしているかを調べ、最終的にその日付を計算に使用するので、パフォーマンスこれは大きな問題です。

これまで私が考えていたことは次のとおりですが、必要な場所に移動できません。

SELECT
Type.TypeDesc
, Status.StatusDesc
, *
FROM
jw50_Item c
OUTER APPLY (SELECT TOP 10000 * FROM jw50_ItemLog csh WHERE csh.ItemID = c.ItemID AND csh.StatusCode = 'OPN' ORDER BY csh.AddDt DESC) [Status]
OUTER APPLY (SELECT TOP 10000 * FROM jw50_ItemLog cth WHERE cth.ItemID = c.ItemID AND cth.ItemTypeCode IN ('F','FG','NG','PF','SXA','AB') ORDER BY cth.AddDt DESC) Type
WHERE
c.ItemID = @ItemID

そのため、以下に示す助けを借りて、必要な場所に到達することができました. これが私の最終的な解決策です:

SELECT 
OrderID
, CustomerNum
, OrderTitle
, ItemTypeDesc
, ItemTypeCode
, StatusCode
, OrdertatusDesc 
FROM 
    jw50_Order c1
    OUTER APPLY (SELECT TOP 1 [DateTime] FROM
                    (SELECT c.ItemTypeCode,     c.OrderStatusCode, c.OrderStatusDt as [DateTime] FROM jw50_Order c     WHERE c.OrderID = c1.OrderID
                    UNION
                    select (select top 1     c2.ItemTypeCode
                            from     jw50_OrderLog c2
                            where     c2.UpdatedDt >= c.UpdatedDt and c2.ItemTypeCode is not null and     c2.OrderID = c.OrderID
                            order by     UpdatedDt DESC
                           ) as type,
                           (select top 1     c2.StatusCode
                            from     jw50_OrderLog c2
                            where     c2.UpdatedDt >= c.UpdatedDt and c2.StatusCode is not null and     c2.OrderID = c.OrderID
                            order by     UpdatedDt DESC
                           ) as status,
                           UpdatedDt as     [DateTime]

                    from jw50_OrderLog c
                    where c.OrderID =     c1.OrderID AND (c.StatusCode IS NOT NULL OR c.ItemTypeCode IS NOT     NULL)
                    ) t
                    WHERE t.ItemTypeCode IN     ('F','FG','NG','PF','SXA','AB') AND t.StatusCode IN ('OPEN')
                    order by [DateTime]) quart
WHERE quart.DateTime <= @FiscalPeriod2 AND c1.StatusCode =     'OPEN'
Order By c1.OrderID

現在のデータは必要な条件を満たしている可能性があるため、ユニオンはログ テーブル データに加えて現在のデータを取り込み、結果セットを作成します。助けてくれてありがとう。

4

2 に答える 2

1

相関サブクエリを使用するアプローチは次のとおりです。

select (select top 1 c2.type
        from jw50_Item c2
        where c2.AddDt >= c.AddDt and c2.type is not null
        order by AddDt
       ) as type,
       (select top 1 c2.status
        from jw50_Item c2
        where c2.AddDt >= c.AddDt and c2.status is not null
        order by AddDt
       ) as status,
       (select AddDt
from jw50_Item c

jw50_item(AddDt, type)とにインデックスがある場合jw50_item(AddDt, status)、パフォーマンスはかなり良いはずです。

于 2013-07-09T00:18:13.060 に答える