DB2 SQL 多个 JOIN 问题
DB2 SQL multiple JOIN issue
我有一个包含两个 JOIN 的查询,但它不起作用。我没有错误。它只是没有 return 任何记录。如果我将查询分开,那么它就可以工作。我在这里做错了什么?
当我拆分查询时,我得到一条记录,这是我应该得到的。
完整查询:
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'
您正在进行内部联接,因此对于 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'
这个问题当然可以使用 table 模式,但我的猜测是 PGLNO
是两个连接之间的不同值。如果是这种情况,连接将不会起作用,因为它实际上是在您当前的查询中寻找 @AAM.AAMGLN = @RFC.RFCGLN
。这是因为两个连接都使用 PGLNO
值,并且两个连接子句需要相同。
如果您想要两个单独的结果,@Charles 的回答应该符合您的要求。
您还可以使用:
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 ...
我有一个包含两个 JOIN 的查询,但它不起作用。我没有错误。它只是没有 return 任何记录。如果我将查询分开,那么它就可以工作。我在这里做错了什么?
当我拆分查询时,我得到一条记录,这是我应该得到的。
完整查询:
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'
您正在进行内部联接,因此对于 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'
这个问题当然可以使用 table 模式,但我的猜测是 PGLNO
是两个连接之间的不同值。如果是这种情况,连接将不会起作用,因为它实际上是在您当前的查询中寻找 @AAM.AAMGLN = @RFC.RFCGLN
。这是因为两个连接都使用 PGLNO
值,并且两个连接子句需要相同。
如果您想要两个单独的结果,@Charles 的回答应该符合您的要求。
您还可以使用:
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 ...