2

結果の最後に、PO のアイテムが在庫されているかどうかを示す列を追加しようとしています (「はい」または「いいえ」で)。opPOTRACK は、PO と表示したいその他の情報を含むテーブルです。inItemLocation は、アイテムごとに行を持つテーブルです。それらは、何らかのテキスト操作の後、opPOTRACK.cpono = inItemLocation.PONO を介して (大まかに) 接続されます。

これまでのところ、結果を一時テーブルに入れ、そのテーブルを通常のクエリに結合するのが最善の方法であると考えてきました。PO 番号を取得する必要がある列で 2 つのテーブルが結合されます (データベースを設計していないため、スキーマを変更することはできません)。文字列操作を行っても最初の結合が遅くなることはないので、2 番目の結合に影響があるかどうかはわかりません。2 番目の参加を追加すると、数分間だけチャグします (4 分後にキャンセルされます。実際にどれくらいかかるかはわかりません)。

参加方法に何か問題があると確信しています。


IF OBJECT_ID('tempdb..#StockedTbl') IS NOT NULL
BEGIN
    DROP TABLE #StockedTbl
END

CREATE TABLE #StockedTbl
(
    ID int IDENTITY(1,1) PRIMARY KEY,
    PONo varchar(10),
    Stocked varchar(5)
)


INSERT INTO #StockedTbl
(
    PONo,
    Stocked
)
SELECT item.PONo, "Stocked" = CASE 
                      WHEN item.Loc LIKE 'ABC%' THEN 'No'
                      ELSE 'Yes'
                      END 
                      FROM inItemLocation item 

CREATE CLUSTERED INDEX IDX_C_StockedTbl_UserID ON #StockedTbl(PONo)


SELECT  *
FROM  (SELECT  RIGHT(LEFT(item.PONo,6), 5) AS POTrunc, item.WhseLoc, po.cpono, po.Buyer, po.Vendno, po.OrderDate, po.StockDate, 
                      po.StockNote, po.Status, po.StatusChangeDate,
                      ROW_NUMBER() OVER (PARTITION BY po.cpono ORDER BY po.cpono) AS RowNumber,
                      st.Stocked
FROM          dbo.inItemLocation item
                    LEFT JOIN dbo.opPOTRACK po ON RIGHT(LEFT(item.PONo,6), 5) = po.cpono
                    LEFT JOIN #StockedTbl st ON RIGHT(LEFT(item.PONo,6), 5) = RIGHT(LEFT(st.PONo,6), 5)
) AS a
WHERE   a.RowNumber = 1 

DROP TABLE #StockedTbl
4

1 に答える 1

3

代わりにこれをお勧めします。まず、なぜ#tempテーブルにIDENTITY列が必要なのか、なぜそれが必要なのPRIMARY KEYか? 次に、結合を容易にする列を作成してみませんか?

CREATE TABLE #StockedTbl
(
    PONo varchar(10),
    Stocked varchar(5),
    PONoMatch AS CONVERT(CHAR(5), RIGHT(LEFT(PONo,6),5)) PERSISTED
);
CREATE CLUSTERED INDEX x ON #StockedTbl(PONoMatch);

これで、少なくともいくつかの節からこれらの計算を取り除くことができますが、作業がどこで行われているかによっては (実行計画がそれを教えてくれます)、ベース テーブルの計算列も考慮する必要があるかもしれません。

于 2012-07-11T20:14:20.333 に答える