请求将含{oj}的SQL查询转换为标准JOIN语法
将含{oj}语法的SQL转换为标准JOIN语法
原始SQL(带{oj}语法)
SELECT ... FROM {oj (((((((((("VMPH" "VMPH" LEFT OUTER JOIN "VMPT" "VMPT" ON "VMPH"."NMPSTID"="VMPT"."NMPSTID") LEFT OUTER JOIN "ARRTA" "ARRTA" ON "VMPH"."TXTERM"="ARRTA"."CODETERM") LEFT OUTER JOIN "VMAGRE" "VMAGRE" ON "VMPH"."NMAGRE"="VMAGRE"."NMDOCID") LEFT OUTER JOIN "VMDH" "VMDH" ON "VMPH"."NMDOCID"="VMDH"."NMDOCID") LEFT OUTER JOIN "VMPTIT" "VMPTIT" ON ("VMPT"."NMPSTID"="VMPTIT"."NMPSTID") AND ("VMPT"."WDTRANNUM"="VMPTIT"."WDTRANNUM")) LEFT OUTER JOIN "VMPTSV" "VMPTSV" ON ("VMPT"."NMPSTID"="VMPTSV"."NMPSTID") AND ("VMPT"."WDTRANNUM"="VMPTSV"."WDTRANNUM")) LEFT OUTER JOIN "VMPTEQ" "VMPTEQ" ON ("VMPT"."NMPSTID"="VMPTEQ"."NMPSTID") AND ("VMPT"."WDTRANNUM"="VMPTEQ"."WDTRANNUM")) LEFT OUTER JOIN "VMDTEQ" "VMDTEQ" ON ("VMPT"."NMDOCID"="VMDTEQ"."NMDOCID") AND ("VMPT"."WDDTTRNUM"="VMDTEQ"."WDTRANNUM")) LEFT OUTER JOIN "VMMTRM" "VMMTRM" ON ("VMPTEQ"."TXEQUP"="VMMTRM"."TXEQUP") AND ("VMPTEQ"."TXMETER"="VMMTRM"."TXMETER")) LEFT OUTER JOIN "VMEQUP" "VMEQUP" ON ("VMPTEQ"."TXEQUP"="VMEQUP"."TXEQUP")) LEFT OUTER JOIN "VMSERV" "VMSERV" ON ("VMPTSV"."WDSERVTYPE"="VMSERV"."WDTYPE") AND ("VMPTSV"."TXSERV"="VMSERV"."TXSERV"))
错误尝试(将连接条件移至WHERE子句)
SELECT ... WHERE "VMPH"."NMPSTID" = "VMPT"."NMPSTID" AND "VMPH"."TXTERM" = "ARRTA"."CODETERM" AND "VMPH"."NMAGRE" = "VMAGRE"."NMDOCID" AND "VMPH"."NMDOCID" = "VMDH"."NMDOCID" AND (("VMPT"."NMPSTID" = "VMPTIT"."NMPSTID") AND ("VMPT"."WDTRANNUM" = "VMPTIT"."WDTRANNUM")) AND (("VMPT"."NMPSTID" = "VMPTSV"."NMPSTID") AND ("VMPT"."WDTRANNUM" = "VMPTSV"."WDTRANNUM")) AND (("VMPT"."NMPSTID"="VMPTEQ"."NMPSTID") AND ("VMPT"."WDTRANNUM"="VMPTEQ"."WDTRANNUM")) AND (("VMPT"."NMDOCID"="VMDTEQ"."NMDOCID") AND ("VMPT"."WDDTTRNUM"="VMDTEQ"."WDTRANNUM")) AND (("VMPTEQ"."TXEQUP"="VMMTRM"."TXEQUP") AND ("VMPTEQ"."TXMETER"="VMMTRM"."TXMETER")) AND "VMPTEQ"."TXEQUP" = "VMEQUP"."TXEQUP" AND (("VMPTSV"."WDSERVTYPE"="VMSERV"."WDTYPE") AND ("VMPTSV"."TXSERV"="VMSERV"."TXSERV"))
转换后的标准JOIN语法SQL
SELECT ... FROM "VMPH" "VMPH" LEFT OUTER JOIN "VMPT" "VMPT" ON "VMPH"."NMPSTID" = "VMPT"."NMPSTID" LEFT OUTER JOIN "ARRTA" "ARRTA" ON "VMPH"."TXTERM" = "ARRTA"."CODETERM" LEFT OUTER JOIN "VMAGRE" "VMAGRE" ON "VMPH"."NMAGRE" = "VMAGRE"."NMDOCID" LEFT OUTER JOIN "VMDH" "VMDH" ON "VMPH"."NMDOCID" = "VMDH"."NMDOCID" LEFT OUTER JOIN "VMPTIT" "VMPTIT" ON "VMPT"."NMPSTID" = "VMPTIT"."NMPSTID" AND "VMPT"."WDTRANNUM" = "VMPTIT"."WDTRANNUM" LEFT OUTER JOIN "VMPTSV" "VMPTSV" ON "VMPT"."NMPSTID" = "VMPTSV"."NMPSTID" AND "VMPT"."WDTRANNUM" = "VMPTSV"."WDTRANNUM" LEFT OUTER JOIN "VMPTEQ" "VMPTEQ" ON "VMPT"."NMPSTID" = "VMPTEQ"."NMPSTID" AND "VMPT"."WDTRANNUM" = "VMPTEQ"."WDTRANNUM" LEFT OUTER JOIN "VMDTEQ" "VMDTEQ" ON "VMPT"."NMDOCID" = "VMDTEQ"."NMDOCID" AND "VMPT"."WDDTTRNUM" = "VMDTEQ"."WDTRANNUM" LEFT OUTER JOIN "VMMTRM" "VMMTRM" ON "VMPTEQ"."TXEQUP" = "VMMTRM"."TXEQUP" AND "VMPTEQ"."TXMETER" = "VMMTRM"."TXMETER" LEFT OUTER JOIN "VMEQUP" "VMEQUP" ON "VMPTEQ"."TXEQUP" = "VMEQUP"."TXEQUP" LEFT OUTER JOIN "VMSERV" "VMSERV" ON "VMPTSV"."WDSERVTYPE" = "VMSERV"."WDTYPE" AND "VMPTSV"."TXSERV" = "VMSERV"."TXSERV"
关键说明
- {oj}语法的作用:{oj}是ODBC规范中的连接标记,用于明确外层连接优先级,标准SQL中可直接移除,链式JOIN写法已能表达相同逻辑。
- 错误尝试的问题:把LEFT JOIN的连接条件移到WHERE子句后,会过滤掉连接表字段为NULL的记录,等同于将LEFT JOIN转为INNER JOIN,完全改变原查询逻辑。
- 转换要点:移除{oj}和多余嵌套括号,保留每个JOIN的
ON子句与连接条件,维持原LEFT OUTER JOIN类型即可,标准SQL支持这种链式写法。
内容的提问来源于stack exchange,提问作者Florenz
相关产品推荐
相关产品推荐

