加入和缺席值

时间:2014-07-14 10:35:30

标签: sql sql-server stored-procedures join null

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从另一行中带来,这也没有用。

它应该如何运作:

在表单中创建一行。然后,第三方程序执行存储过程(Asp_BuildShipments),并在将结果插入表Shipments后显示结果。此SP旨在通过从订单,客户,驱动程序,车辆,价格,路线等中提取值来填充表格货件。它是一个很长的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需要几分钟,新的只需几秒钟。但是如果没有逐行传递,我们无法确定如何检查每个订单以查看在发货中构建行之前是否具有匹配的价格。

我知道这里缺少细节,但我不想写一个1000页的问题。如果这些细节不足,我会尽可能多地发布,以帮助你的大脑风暴。被困在这一段时间了......

提前致谢:)

2 个答案:

答案 0 :(得分:1)

这可能就像这样简单:

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
       LEFT JOIN Prices P on CL.PriceKey = P.PriceKey
           AND O.PriceFactor1 = P.PriceFactor1
           AND O.PriceFactor2 = P.PriceFactor2
           AND O.PriceFactor3 = P.PriceFactor3

答案 1 :(得分:0)

理查德汉塞尔的答案应该有效,如果问题是你建议价格中没有匹配的行。由于它不起作用,问题在于其他连接。

其中一个联接会过滤掉数据。

JOIN Clients CL on O.ClientNo = CL.ClientNo
JOIN Calc C on CL.CalcCode = C.CalcCode