4

在我的 Oracle DB 中,我有一个父工单与其子工单的左外连接。然后我运行一个计算,执行一些子值的 SUM()。我将子工单的结果包装在 Nvl() 中,以确保正确计算它们。

这有效,除非父级没有子工单。在这种情况下,显示期间返回的“空值”是因为连接中没有结果,因此 Nvl([fieldname],0) 似乎没有将它们转换为显示 0。因此,当我认为 sum具有父值的子值,由于将值添加到空值,它们也返回空值。

解决这个问题的最佳方法是什么?这是可以解决的问题,还是我的查询从根本上有问题的气味?

查询

抱歉,我目前无法发布它的设置。对于这个特定的工作订单(硬编码),连接的“右手”部分是空的,因为父级没有子级,因此显示为 null。

SELECT *
FROM   (SELECT *
        FROM   R_PCR_ALLWOSANDTASKSSEPARATELY)WOINFO
       LEFT OUTER JOIN (SELECT WORKORDERNUMBER                AS TASKWORKORDRENUMBER
                               , PARENT                       AS TASKPARENT
                               , NVL(TOTALMATESTCOSTFORWO, 0) AS TOTALMATESTCOSTFORWO_TASK
                               , NVL(TOTALLABESTCOSTFORWO,0)         AS TOTALLABESTCOSTFORWO_TASK
                               , NVL(TOTALMATACTCOSTFORWO,0)         AS TOTALMATACTCOSTFORWO_TASK
                               , NVL(TOTALLABACTCOSTFORWO,0)         AS TOTALLABACTCOSTFORWO_TASK
                               , NVL(TOTALLABACTHOURSFORWO,0)        AS TOTALLABACTHOURSFORWO_TASK
                        FROM   R_PCR_ALLWOSANDTASKSSEPARATELY)TASKINFO
         ON ( WOINFO.WORKORDERNUMBER = TASKINFO.TASKPARENT )
WHERE  WORKORDERNUMBER = '2826059'; 
4

1 回答 1

6

LEFT join返回结果后需要申请NVL。

试试这个:

SELECT  WOINFO.*
                , TASKWORKORDRENUMBER
                , TASKPARENT
                , NVL(TOTALMATESTCOSTFORWO_TASK,0) AS TOTALMATESTCOSTFORWO_TASK
                , NVL(TOTALLABESTCOSTFORWO_TASK,0) AS TOTALLABESTCOSTFORWO_TASK
                , NVL(TOTALMATACTCOSTFORWO_TASK,0) AS TOTALMATACTCOSTFORWO_TASK
                , NVL(TOTALLABACTCOSTFORWO_TASK,0) AS TOTALLABACTCOSTFORWO_TASK
                , NVL(TOTALLABACTHOURSFORWO_TASK,0) AS TOTALLABACTHOURSFORWO_TASK
FROM   R_PCR_ALLWOSANDTASKSSEPARATELY WOINFO
       LEFT OUTER JOIN (SELECT WORKORDERNUMBER                AS TASKWORKORDRENUMBER
                               , PARENT                       AS TASKPARENT
                               , TOTALMATESTCOSTFORWO_TASK
                               , TOTALLABESTCOSTFORWO_TASK
                               , TOTALMATACTCOSTFORWO_TASK
                               , TOTALLABACTCOSTFORWO_TASK
                               , TOTALLABACTHOURSFORWO_TASK
                        FROM   R_PCR_ALLWOSANDTASKSSEPARATELY) TASKINFO
         ON ( WOINFO.WORKORDERNUMBER = TASKINFO.TASKPARENT )
WHERE  WORKORDERNUMBER = '2826059'; 
于 2012-03-02T03:19:56.300 回答