You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将正常运行的SQL查询改写为SQLite兼容语法(ON子句报错修复)

SQLite中ON子句报错的修正方案

问题背景

现有一段可正常运行的SQL查询语句,但在SQLite环境执行时触发ON子句相关报错,经定位,报错由以下代码段导致:

LEFT OUTER JOIN tew_componentterminal ON 
  vew_wire_ex.wir_cel_idfrom = tew_componentterminal.cte_cel_id AND 
  vew_wire_ex.wir_cte_nofrom = tew_componentterminal.cte_no OR 
  vew_wire_ex.wir_cel_idto = tew_componentterminal.cte_cel_id AND 
  vew_wire_ex.wir_cte_noto = tew_componentterminal.cte_no 
  ON tew_componentelement.cel_id = tew_componentterminal.cte_cel_id

错误根源

  1. JOIN语法不规范:SQLite要求每个JOIN必须紧跟对应的ON关联条件,原代码中LEFT OUTER JOIN vew_wire_ex未指定关联条件就直接嵌套后续JOIN,且出现连续两个ON子句,违反SQLite语法规则。
  2. 逻辑优先级错误:OR运算符优先级低于AND,原代码中的条件会被错误解析,导致关联逻辑偏离预期。

修正后的关键代码段

将嵌套JOIN结构调整为明确的子查询块,用括号包裹OR两侧的逻辑组,确保每个JOIN都有对应的关联条件:

LEFT OUTER JOIN (
  vew_wire_ex
  LEFT OUTER JOIN tew_componentterminal 
    ON (
      (vew_wire_ex.wir_cel_idfrom = tew_componentterminal.cte_cel_id AND vew_wire_ex.wir_cte_nofrom = tew_componentterminal.cte_no)
      OR
      (vew_wire_ex.wir_cel_idto = tew_componentterminal.cte_cel_id AND vew_wire_ex.wir_cte_noto = tew_componentterminal.cte_no)
    )
) ON tew_componentelement.cel_id = tew_componentterminal.cte_cel_id

完整修正后的SQL语句

SELECT DISTINCT
            tew_componentparent.com_tagpath AS vcomcom_com_tagpath
            , tew_component.com_tagpath AS com_tagpath
            , tew_component.com_id AS com_id
            , tew_component.com_tagmanual AS com_tagmanual
            , tew_componentelement.cel_group AS cel_group
            , tew_componentelement.cel_orderno AS cel_orderno
            , tew_componentelement.cel_id AS cel_id
            , tew_componentterminal.cte_txt AS cte_txt
            , tew_componentterminal.cte_no AS cte_no
            , vew_wire_ex.cab_id AS cab_id
            , vew_wire_ex.cab_tag AS cab_tag
            , vew_wire_ex.caw_no AS caw_no
            , vew_wire_ex.caw_section AS caw_section
            , vew_wire_ex.caw_tra_0_l1 AS caw_tra_0_l1
            , vew_wire_ex.wir_tag AS wir_tag
            , vew_wire_ex.wir_id AS wir_id
            , vew_wire_ex.vwircomto_com_id AS vwircomto_com_id
            , vew_wire_ex.wir_type AS wir_type
            , vew_wire_ex.equ_text AS equ_text
            , vew_wire_ex.equ_id AS equ_id
            , vew_wire_ex.equ_columnmark AS equ_columnmark
            , vew_wire_ex.equ_rowmark AS equ_rowmark
            , vew_wire_ex.cab_ductpath AS cab_ductpath
            , vew_wire_ex.vwircomcomfrom_com_tagpath AS vwircomcomfrom_com_tagpath
            , vew_wire_ex.vwircomcomto_com_tagpath AS vwircomcomto_com_tagpath
            , vew_wire_ex.vwircomfrom_com_tagpath AS vwircomfrom_com_tagpath
            , vew_wire_ex.vwircomto_com_tagpath AS vwircomto_com_tagpath
            , vew_wire_ex.vwircomfrom_com_tagmanual AS vwircomfrom_com_tagmanual
            , vew_wire_ex.vwircomto_com_tagmanual AS vwircomto_com_tagmanual
            , vew_wire_ex.vwircelfrom_cel_group AS vwircelfrom_cel_group
            , vew_wire_ex.vwircelto_cel_group AS vwircelto_cel_group
            , vew_wire_ex.vwirctefrom_cte_txt AS vwirctefrom_cte_txt
            , vew_wire_ex.vwircteto_cte_txt AS vwircteto_cte_txt
            , locfrom.loc_tagpath AS locfrom_tagpath
            , locto.loc_tagpath AS locto_tagpath
            , funfrom.fun_tagpath AS funfrom_tagpath
            , funto.fun_tagpath AS funto_tagpath
            , funfrom.fun_tra_0_l1 AS funfrom_tra_0_l1
            , funto.fun_tra_0_l1 AS funto_tra_0_l1
            , locfrom.loc_tra_0_l1 AS locfrom_tra_0_l1
            , locto.loc_tra_0_l1 AS locto_tra_0_l1
            , locto.loc_id AS loc_to_id

            , CASE WHEN  vwircomto_com_id = tew_component.com_id THEN vwircomcomfrom_com_tagpath ELSE vwircomcomto_com_tagpath END AS comdest_comcom_tagpath
            , CASE WHEN  vwircomto_com_id = tew_component.com_id THEN vwircomfrom_com_tagpath ELSE vwircomto_com_tagpath END AS comdest_com_tagpath
            , CASE WHEN  vwircomto_com_id = tew_component.com_id THEN vwircomfrom_com_tagmanual ELSE vwircomto_com_tagmanual END AS comdest_com_tagmanual
            , CASE WHEN  vwircelto_cel_id = tew_componentelement.cel_id THEN vwircelfrom_cel_group ELSE vwircelto_cel_group END AS comdest_cel_group
            , CASE WHEN  vwircelto_cel_id = tew_componentelement.cel_id THEN vwirctefrom_cte_txt ELSE vwircteto_cte_txt END AS comdest_cte_txt
            , CASE WHEN  vwircelto_cel_id = tew_componentelement.cel_id THEN locfrom.loc_tagpath ELSE locto.loc_tagpath END AS comdest_loc_tagpath
            , CASE WHEN  vwircelto_cel_id = tew_componentelement.cel_id THEN funfrom.fun_tagpath ELSE funto.fun_tagpath END AS comdest_fun_tagpath
            , CASE WHEN  vwircelto_cel_id = tew_componentelement.cel_id THEN funfrom.fun_tra_0_l1 ELSE funto.fun_tra_0_l1 END AS comdest_fun_tra_0_l1
            , CASE WHEN  vwircelto_cel_id = tew_componentelement.cel_id THEN locfrom.loc_tra_0_l1 ELSE locto.loc_tra_0_l1 END AS comdest_loc_tra_0_l1

            , vew_wire_ex.cab_standard AS cab_standard
            , vew_wire_ex.wir_sectionorgauge AS wir_sectionorgauge
            , vew_wire_ex.wir_sectiontype AS wir_sectiontype
                  , vew_plcinout_ex.cel_id AS GtW_CELID
                  , vew_plcinout_ex.aio_tra_0_l1
                  , vew_plcinout_ex.aio_tra_1_l1
                  , vew_plcinout_ex.aio_tra_2_l1
                  , vew_plcinout_ex.aio_tra_3_l1
                  , vew_plcinout_ex.aio_tra_4_l1
                  , vew_plcinout_ex.aio_mnemonic
                  , vew_plcinout_ex.aio_id
                  , vew_plcinout_ex.aio_cel_id
, vew_plcinout_ex.bom_reference AS bom_reference
 FROM            vew_plcinout_ex
            INNER JOIN
                         tew_componentelement ON vew_plcinout_ex.cel_id = tew_componentelement.cel_id 
            LEFT OUTER JOIN (
                         vew_wire_ex 
                         LEFT OUTER JOIN tew_componentterminal 
                         ON (
                             vew_wire_ex.wir_cel_idfrom = tew_componentterminal.cte_cel_id AND vew_wire_ex.wir_cte_nofrom = tew_componentterminal.cte_no
                             OR 
                             vew_wire_ex.wir_cel_idto = tew_componentterminal.cte_cel_id AND vew_wire_ex.wir_cte_noto = tew_componentterminal.cte_no
                         )
            ) ON tew_componentelement.cel_id = tew_componentterminal.cte_cel_id 
            LEFT OUTER JOIN
                         tew_component ON tew_component.com_id = tew_componentelement.cel_com_id 
            LEFT OUTER JOIN
                         tew_component AS tew_componentparent ON tew_componentparent.com_id = tew_component.com_com_id 
            LEFT OUTER JOIN
                         vew_location AS locfrom ON vew_wire_ex.vwircomfrom_com_loc_id = locfrom.loc_id 
            LEFT OUTER JOIN
                         vew_location AS locto ON vew_wire_ex.vwircomto_com_loc_id = locto.loc_id 
            LEFT OUTER JOIN
                         vew_function AS funfrom ON vew_wire_ex.vwircomfrom_com_fun_id = funfrom.fun_id 
            LEFT OUTER JOIN
                         vew_function AS funto ON vew_wire_ex.vwircomto_com_fun_id = funto.fun_id

WHERE        (vew_plcinout_ex.aio_cel_id > - 1)

内容的提问来源于stack exchange,提问作者GaituutH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:17:32