【问题标题】:JOINS and absentee valuesJOINS 和缺席值
【发布时间】: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


    【解决方案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
    

    【讨论】:

    • 显然不是。这是我一开始尝试的事情之一,希望它会返回 NULL。相反,SP 根本不构建行。我相信问题实际上是 AND 条件(O.PriceFactor1...3 = P.PriceFactor1...3),但如果我们删除它们,它就会变得一团糟。必须在订单中列出的定价因素和价格中列出的因素之间进行比较,但是添加这些条件似乎会使任何与 SP 眼中的价格不匹配的订单无效。无论如何谢谢:)
    • A LEFT OUTER JOIN 最终是答案,虽然不是我寻找的方式。
    【解决方案2】:

    如果问题是您建议的价格中没有匹配的行,Richard Hansell 的答案应该有效。由于它不起作用,问题出在其他联接中。

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-18
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2018-11-25
      • 2011-04-05
      • 2017-08-08
      • 2019-04-11
      相关资源
      最近更新 更多