【发布时间】:2014-07-14 10:35:29
【问题描述】:
INSERT INTO Shipments (Column1...Column200)
SELECT
O.Value1,...
CL.Value199,
isnull(P.PriceFactor1,1)
FROM Orders O
JOIN Clients CL on O.ClientNo = CL.ClientNo
JOIN Calc C on CL.CalcCode = C.CalcCode
JOIN Prices P on CL.PriceKey = P.PriceKey
WHERE O.PriceFactor1 = P.PriceFactor1
AND O.PriceFactor2 = P.PriceFactor2
AND O.PriceFactor3 = P.PriceFactor3
上述查询(新存储过程的一部分,旨在替换使用游标的旧且讨厌的存储过程...)未能返回一些行,因为 Orders 中的行在 Price 中没有匹配的行。在这种情况下,我们希望 INSERT 列表中的最后一个值默认为 1。相反,该行永远不会被构建;或者,当我们尝试通过更改 WHERE 条件来修复它时,它会将 PriceFactor1 从不同的行中引入,这也不好。
它应该如何工作:
在表 Orders 中创建了一行。第三方程序然后执行存储过程 (Asp_BuildShipments) 并在结果插入表 Shipments 后显示结果。该 SP 旨在通过从 Orders、Clients、Drivers、Vehicles、Prices、Routes 等中提取值来填充表 Shipments。这是一个很长的 SP,而且表的数组很大而且种类繁多。
In table Orders:
PriceFactor1 | PriceFactor2 | PriceFactor3
12 | 10 | 8
In table Prices:
PriceFactor1 | PriceFactor2 | PriceFactor3
18 | 12 | 10
在这种情况下,SP 需要认识到价格中不存在此类行并使用默认值 1,而不是跳过该行或从不同行提取价格。
我们尝试过 isnull()、CASE 语句和 WHERE EXISTS,但无济于事。
新 SP 是基于设置的,我们希望保持这种状态 - 旧 SP 需要几分钟,新 SP 只需几秒钟。但如果不逐行传递,我们不确定如何在 Shipments 中构建行之前检查每个单独的订单以查看是否有匹配的价格。
我知道这里缺少详细信息,但我不想写一个 1,000 页的问题。如果这些细节不充分,我会尽可能多地发布,以帮助您头脑风暴。卡在这个问题上一段时间了...
提前谢谢:)
【问题讨论】:
标签: sql sql-server stored-procedures join null