SQL错误[42972]:[SQL0338]JOIN谓词或MERGE ON子句无效

SQL错误[42972]:[SQL0338]JOIN谓词或MERGE ON子句无效,sql,db2,ibm-midrange,Sql,Db2,Ibm Midrange,SQL错误[42972]:[SQL0338]JOIN谓词或MERGE ON子句无效 我试图运行下面的查询,但表DB170P中的联接中出现错误。你能帮我吗 SELECT ACBAC AS "CBUYER" , HBAC AS "BORDER" , IHTRCD AS "TRANS" , IHRVCD AS "REV" , DATE(CONCAT(CONCAT(CONCAT(CON

SQL错误[42972]:[SQL0338]JOIN谓词或MERGE ON子句无效

我试图运行下面的查询,但表DB170P中的联接中出现错误。你能帮我吗

SELECT ACBAC AS "CBUYER"
,      HBAC AS "BORDER"
,      IHTRCD AS "TRANS"
,      IHRVCD AS "REV"
,      DATE(CONCAT(CONCAT(CONCAT(CONCAT(IHTRMM,'/'),IHTRDD),'/'),IHTRCC*100+IHTRYY)) AS "RECD"
,      VADFCD AS "DF"
,      HVEND  AS "VENC"
,      VSNAME AS "VNAME"
,      IHSRNO AS "SER"
,      DATE(PHCUMM||'/'||PHCUDD||'/'||(PHCUCC*100+PHCUYY)) "CUST_DATE"
,      PHBLNO AS "B/L"
,      IHPLST AS "NF"
,      IHORNO AS "PO"
,      IHPNO  AS "PN"
,      MODEL
,      (CASE WHEN CONCAT(IHTRCD, IHRVCD) IN('D20','D50T','D50Y','E30') THEN IHQTY ELSE -IHQTY END) AS "QTY"
,      IHUNMS AS "UN"
,      HPOCST AS "COST"
,      DBCRCY AS "CURRENCY"
,      (HPOCST*(CASE WHEN CONCAT(IHTRCD, IHRVCD) IN('D20','D50T','D50Y','E30') THEN IHQTY ELSE -IHQTY END)) AS "TOTAL"
--,      CASE WHEN VADFCD='D' THEN 1 ELSE DB170P.DBRATE END AS "EXRAT"
--,      (HPOCST*(CASE WHEN VADFCD='D' THEN 1 ELSE DB170P.DBRATE END)) AS "CLC"
--,      (HPOCST*(CASE WHEN CONCAT(IHTRCD, IHRVCD) IN('D20','D50T','D50Y','E30') THEN IHQTY ELSE -IHQTY END)*(CASE WHEN VADFCD='D' THEN 1 ELSE DB170P.DBRATE END)) AS "TOTALLC"
FROM (SELECT * FROM IC090P UNION SELECT * FROM IC090B)AAA 
LEFT OUTER JOIN (SELECT * FROM PC090P, PC100P WHERE PIBLNO=PHBLNO )X ON TRIM(PIIVNO)=TRIM(IHPLST)  
,DB070P , IC010P
LEFT OUTER JOIN 
               (SELECT * FROM DB160P)DB160P 
               ON HCRCD=DB160P.DBCRCD
LEFT OUTER JOIN
               (SELECT * FROM DB170P)DB170P
               on (db160p.DBCRCD=DB170P.DBCRCD
               AND DATE(CONCAT(CONCAT(CONCAT(CONCAT(DBEFMM,'/'),DBEFDD),'/'),
               DBEFCC*100+DBEFYY))=DATE((DAYS(DATE(PHCUMM||'/'||PHCUDD||'/'||(PHCUCC*100+PHCUYY)))-2)))
DB170PDB170P中的左外连接SELECT*语法非常奇怪。。。 左外接DP170P是您真正需要的

在连接到DB170P的过程中,尝试转换为日期数据类型时可能会出现错误

您是否在作业日志中查看了其他错误信息

我建议

从嵌套表表达式NTE移动到通用表表达式CTE 构建一个用户定义的函数UDF来处理日期转换或下载开源 在CTEs中通过自定义项进行日期转换 使用显式联接 通常最好不要使用SELECT*,即使您确实需要所有列 以下是一个CTE版本开始时的样子

with AAAA as (SELECT trim(IHPLST) as lastInvNbr
             FROM IC090P 
             UNION 
             SELECT trim(IHPLST) 
             FROM IC090B)
 , X as (SELECT trim(PIIVNO) as InvNbr 
         FROM PC090P 
         join PC100P 
           on PIBLNO=PHBLNO
         )
select * 
from aaaa join X on aaaa.lastInvNbr = x.InvNo

除了可重用之外,CTE还可以很容易地从mycte中删除SELECT*,以便在构建语句时可以看到中间结果。

错误消息是针对DB2的,因此MySQL标记不合适。显式连接链在隐式、逗号分隔的连接之前进行计算。范围问题?最好的编程实践是限定所有列,至少当涉及多个表时。HCRCD属于哪个表?它属于IC010P表。