我正在尝试在结果的末尾添加一列,以显示PO中的任何项目是否已存储(带有“是”或“否”)。 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
答案 0 :(得分: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);
现在至少你可以从你的一些子句中获取这些计算,但是根据工作的完成位置(执行计划可以告诉我们),你可能还需要考虑基表上的计算列。