DB2 SQL多个JOIN问题

时间:2018-08-24 20:22:39

标签: sql db2 db2-400 rpgle

我有两个JOIN的查询,但它不起作用。我没有错误。它只是不返回任何记录。如果我分开查询,那么它将起作用。我在这里做错什么了?

当我拆分查询时,每条记录我都会得到一条记录。

完整查询:

SELECT HPOL07.*, @RFC.*, @AAM.*
FROM BPCSPROF.HPOL07
JOIN BPCSPROF.@RFC ON PRFC = @RFC.RFCNUM  AND PPRF = @RFC.RFCPRC
 AND PGLNO = @RFC.RFCGLN
JOIN BPCSPROF.@AAM ON PPRF = @AAM.AAMPRC  AND PGLNO = @AAM.AAMGLN
WHERE PORD = '605400' AND PID <> 'PZ' 

单独的查询:

 SELECT HPOL07.*, @RFC.*
    FROM BPCSPROF.HPOL07
    JOIN BPCSPROF.@RFC ON PRFC = @RFC.RFCNUM  AND PPRF = @RFC.RFCPRC
    AND PGLNO = @RFC.RFCGLN
 WHERE PORD = '605400' AND PID <> 'PZ'


SELECT HPOL07.*, @AAM.*
   FROM BPCSPROF.HPOL07
   JOIN BPCSPROF.@AAM ON PPRF = @AAM.AAMPRC  AND PGLNO = @AAM.AAMGLN
WHERE PORD = '605400' AND PID <> 'PZ' 

3 个答案:

答案 0 :(得分:1)

您正在执行内部联接,因此对于HPOL07中的每个记录,@ RFC和@AAM中都必须有一条记录...

这就是您想要的吗?

如果@RFC或@AAM中有匹配的记录,则您想使用LEFT OUTER JOIN

SELECT HPOL07.*, @RFC.*, @AAM.*
FROM BPCSPROF.HPOL07
LEFT OUTER JOIN BPCSPROF.@RFC 
  ON PRFC = @RFC.RFCNUM  AND PPRF = @RFC.RFCPRC
     AND PGLNO = @RFC.RFCGLN
LEFT OUTER JOIN BPCSPROF.@AAM 
  ON PPRF = @AAM.AAMPRC  AND PGLNO = @AAM.AAMGLN
WHERE PORD = '605400' AND PID <> 'PZ' 

答案 1 :(得分:0)

这个问题当然可以使用表模式,但是我的猜测是PGLNO是两个联接之间的不同值。如果是这种情况,则联接将无法正常工作,因为它正在有效地在当前查询中寻找@AAM.AAMGLN = @RFC.RFCGLN。这是因为两个联接都使用PGLNO值,并且两个联接子句都必须相同。

如果您想要两个单独的结果,@ Charles答案应该做您想要的。

答案 2 :(得分:0)

您还可以使用:

SELECT * FROM A h 
   LEFT JOIN B pk ON (pk.PKKONZ='010') AND (pk.PKFIRM IN (10, 20 30)) AND h.TPPALN = pk.PKPALN 
   LEFT JOIN C ar ON (ar.TZKONZ='010') AND (ar.TZFIRM IN (55, 56 ,57)) AND h.TPIDEN = ar.TZIDEN
   WHERE ....
   ORDER BY ...