2013-04-02 109 views
0

尝试在右表中检索MAX文档。PL SQL - 加入2个表并从右表返回最大值

SELECT F43.PDDOCO, 
    F43.PDSFXO, 
    F43.PDLNID, 
    F43.PDAREC/100 As Received, 
    F431.PRAREC/100, 
    max(F431.PRDOC) 

FROM  PRODDTA.F43121 F431 
    LEFT OUTER JOIN PRODDTA.F4311 F43 
     ON 
      F43.PDKCOO=F431.PRKCOO 
     AND F43.PDDOCO=F431.PRDOCO 
     AND F43.PDDCTO=F431.PRDCTO 
     AND F43.PDSFXO=F431.PRSFXO 
     AND F43.PDLNID=F431.PRLNID 
WHERE F431.PRDOCO = 401531 
and  F431.PRMATC = 2 
and  F43.PDLNTY = 'DC' 

Group by 

    F43.PDDOCO, 
    F43.PDSFXO, 
    F43.PDLNID, 
    F43.PDAREC, 
    F431.PRAREC/100 

该查询仍然返回右表中的两行。对于SQL来说是相当新颖的东西,并且正在为这个声明而努力。任何帮助,将不胜感激。

回答

0

如果没有看到您的数据,很难分辨出问题出在哪里,所以我会提供一些有用的建议。

首先,您将加入PRODDTA.F4311上的LEFT JOIN,但您在WHERE子句中有该表的过滤器。您应该将F43.PDLNTY = 'DC'移动到JOIN状态。这导致查询的行为像一个INNER JOIN

其次,您可以尝试使用子查询来获取MAX(PRDOC)值。然后,您可以限制您正在分组的列,以消除重复项。查询将他们类似于以下内容:

SELECT F43.PDDOCO, 
    F43.PDSFXO, 
    F43.PDLNID, 
    F43.PDAREC/100 As Received, 
    F431.PRAREC/100, 
    F431.PRDOC 
FROM PRODDTA.F43121 F431 
INNER JOIN 
(
    -- subquery to get the max 
    -- then group by the distinct columns 
    SELECT PDKCOO, max(PRDOC) MaxPRDOC 
    FROM PRODDTA.F43121 
    WHERE PRDOCO = 401531 
    and PRMATC = 2 
    GROUP BY PDKCOO 
) f2 
    -- join the subquery result back to the PRODDTA.F43121 table 
    on F431.PRDOC = f2.MaxPRDOC 
    AND F431.PDKCOO = f2.PDKCOO 
LEFT OUTER JOIN PRODDTA.F4311 F43 
    ON F43.PDKCOO=F431.PRKCOO 
    AND F43.PDDOCO=F431.PRDOCO 
    AND F43.PDDCTO=F431.PRDCTO 
    AND F43.PDSFXO=F431.PRSFXO 
    AND F43.PDLNID=F431.PRLNID 
    AND F43.PDLNTY = 'DC' -- move this filter to the join instead of the WHERE 
WHERE F431.PRDOCO = 401531 
    and F431.PRMATC = 2 

如果您提供您的表结构和一些示例数据,将更容易确定问题。