单行子查询返回多行-Case语句

时间:2019-05-01 10:01:18

标签: sql oracle

我的以下代码返回标题中指出的错误,但是当case语句独自运行时,该错误不会显示。

我试图拆除case语句,但是这不是我的查询,而是在其他地方使用,我想知道他们如何设法使其返回当前状态的行。

SELECT DISTINCT V55."INPUTSPECNAME",
                V55."FKMATERIAL",
                V55."INPUTQUANTITYVALUE",
                B.ABBREVIATION,
                (CASE
                   WHEN z.COST IS NULL
                     THEN (SELECT DISTINCT (CASE
                                              WHEN MatOut_D.PERVALUEQUANTITY > 0 THEN
                                                ROUND(MatOut_D.PRICE / 
                                                      MatOut_D.PERVALUEQUANTITY /
                                                      10 /
                                                      MatOut_E.USDCONVERSIONFACTOR *
                                                      C.USDCONVERSIONFACTOR, 5)
                                              ELSE 0
                                            END)
                             FROM V55_FORMULATIONJOINMATOUTPUT MatOut_B,
                                  V55_FORMULATIONINPUTOUTPUT MatOut_C,
                                  THEORETICALCOSTS MatOut_D,
                                  COMMONCURRENCIES MatOut_E,
                                  UOMML MatOut_F
                             WHERE MatOut_B.FKREFERENCEDMATERIAL = V55.FKMATERIAL
                               AND MatOut_B.FKOWNER = MatOut_C.FKOWNER
                               AND MatOut_C.FORMULATIONOUTPUTPKID = MatOut_D.FKPARENT
                               AND MatOut_D.FKCURRENCY = MatOut_E.PKID
                               AND MatOut_D.FKPERVALUEUOM = MatOut_F.FKUOM
                               AND MatOut_F.LANGID = 0)
                   ELSE ROUND(z.COST*100/D.USDCONVERSIONFACTOR*C.USDCONVERSIONFACTOR,5)
                 END) AS  COST_100G
  FROM V55_FORMULATIONINPUTOUTPUT V55
  INNER JOIN UOM A 
    on V55.FKINPUTUOM = A.PKID
  INNER JOIN UOMML B 
    on a.pkid = B.FKUOM
  INNER JOIN DWBSpecificationRoots dwbRoot 
    on dwbRoot.fkOwner = V55.FKOWNER
  INNER JOIN dwbSpecifications dwbSpec 
    ON dwbSpec.fkWorkingVersionParent = dwbRoot.pkid
  LEFT OUTER JOIN specLegacySpecJoin y 
    on dwbSpec.fkdisplayedlegacyprofile = y.fklegacyprofileid 
       and y.fkspecid = V55.fkMaterial
  LEFT OUTER join COSTITEMS z   
    on z.equivalent = y.equivalent 
      and z.fklegacyprofile = dwbSpec.fkdisplayedlegacyprofile 
      and z.FKSCRMENTITY = dwbSpec.FKSCRMSUPPLIERBASE 
      and z.COSTTYPE = dwbSpec.COSTTYPE
  LEFT OUTER JOIN COMMONCURRENCIES C 
    ON C.PKID = dwbSpec.FKCURRENCY
  LEFT OUTER JOIN COMMONCURRENCIES D 
    ON D.PKID = Z.FKCURRENCY

1 个答案:

答案 0 :(得分:0)

问题是您的CASE语句中的子查询在某些情况下会返回多行,正如问题的注释中所指出的那样。

我建议您将子查询从CASE语句中拉出,并使其成为通用表表达式,然后将其与其他任何表一样加入查询中:

WITH cteSubexpr AS (SELECT DISTINCT MatOut_B.FKREFERENCEDMATERIAL,
                                    (CASE
                                       WHEN MatOut_D.PERVALUEQUANTITY > 0 THEN
                                         ROUND(MatOut_D.PRICE / 
                                               MatOut_D.PERVALUEQUANTITY /
                                               10 /
                                               MatOut_E.USDCONVERSIONFACTOR *
                                               C.USDCONVERSIONFACTOR, 5)
                                       ELSE 0
                                     END) AS CALC_QTY
                      FROM V55_FORMULATIONJOINMATOUTPUT MatOut_B
                      INNER JOIN V55_FORMULATIONINPUTOUTPUT MatOut_C
                        ON MatOut_C.FKOWNER = MatOut_B.FKOWNER
                      INNER JOIN THEORETICALCOSTS MatOut_D
                        ON MatOut_D.FKPARENT = MatOut_C.FORMULATIONOUTPUTPKID
                      INNER JOIN COMMONCURRENCIES MatOut_E
                        ON MatOut_E.PKID = MatOut_D.FKCURRENCY
                      INNER JOIN UOMML MatOut_F
                        ON MatOut_F.FKUOM = MatOut_D.FKPERVALUEUOM
                      WHERE MatOut_F.LANGID = 0)
SELECT DISTINCT V55.INPUTSPECNAME,
                V55.FKMATERIAL,
                V55.INPUTQUANTITYVALUE,
                B.ABBREVIATION,
                (CASE
                   WHEN z.COST IS NULL
                     THEN cs.CALC_QTY
                   ELSE ROUND(z.COST * 100 / D.USDCONVERSIONFACTOR * C.USDCONVERSIONFACTOR, 5)
                 END) AS COST_100G
  FROM V55_FORMULATIONINPUTOUTPUT V55
  INNER JOIN cteSubexpr cs
    ON cs.FKREFERENCEDMATERIAL = V55.FKMATERIAL
  INNER JOIN UOM A 
    on V55.FKINPUTUOM = A.PKID
  INNER JOIN UOMML B 
    on a.pkid = B.FKUOM
  INNER JOIN DWBSpecificationRoots dwbRoot 
    on dwbRoot.fkOwner = V55.FKOWNER
  INNER JOIN dwbSpecifications dwbSpec 
    ON dwbSpec.fkWorkingVersionParent = dwbRoot.pkid
  LEFT OUTER JOIN specLegacySpecJoin y 
    on dwbSpec.fkdisplayedlegacyprofile = y.fklegacyprofileid 
       and y.fkspecid = V55.fkMaterial
  LEFT OUTER join COSTITEMS z   
    on z.equivalent = y.equivalent 
      and z.fklegacyprofile = dwbSpec.fkdisplayedlegacyprofile 
      and z.FKSCRMENTITY = dwbSpec.FKSCRMSUPPLIERBASE 
      and z.COSTTYPE = dwbSpec.COSTTYPE
  LEFT OUTER JOIN COMMONCURRENCIES C 
    ON C.PKID = dwbSpec.FKCURRENCY
  LEFT OUTER JOIN COMMONCURRENCIES D 
    ON D.PKID = Z.FKCURRENCY

好运。