Однорядный подзапрос возвращает более одной строки - оператор Case - PullRequest
1 голос
/ 01 мая 2019

Мой следующий код возвращает ошибку, указанную в заголовке, однако ошибка не отображается, когда оператор 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 голосов
/ 01 мая 2019

Проблема в том, что подзапрос в вашем операторе CASE возвращает несколько строк в некоторых ситуациях, и, как было сказано в комментариях к вопросу, это нет-нет.

Я предлагаю вам вытащить подзапрос изоператор CASE и сделайте его выражением Common Table, а затем включите его в запрос, как и любую другую таблицу:

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

Best of luck.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...