2

我正在尝试在我的结果末尾添加一列,显示采购订单中的任何项目是否有库存(带有“是”或“否”)。opPOTRACK 是我的表,其中包含我想要显示的 PO 和其他信息,inItemLocation 是每个项目都有一行的表。在一些文本操作之后,它们是通过 opPOTRACK.cpono = inItemLocation.PONO (松散地)连接。

到目前为止,我认为最好的方法是将结果放在一个临时表中,然后将该表与我的正常查询连接起来。其中两个表连接在我必须派生 PO 编号的列上(我没有设计数据库,也无法更改架构)。进行字符串操作不会减慢我的第一次加入速度,所以我不确定它是否会影响我的第二次加入。当我添加第二个加入时,它只会持续几分钟(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 回答