oracle - 这个 UPDATE SQL JOIN 语法有什么问题?
问题描述
作为数据迁移的一部分,尝试根据另一个表中的值更新表中的列。所有列都存在于连接中的两个表中,但是当我运行以下命令时收到意外错误消息:
UPDATE CSB
SET IFS10_SCHEDULE = CS.SCHEDULE_NO
FROM IC_U_CUSTOMER_SCHED_B CSB
JOIN CUST_SCHED CS
ON CSB.CUSTOMER_NO = CS.CUSTOMER_NO
AND CS.SHIP_ADDR_NO = CSB.SHIP_ADDR_NO
AND CSB.CUSTOMER_PART_NO = CS.CUSTOMER_PART_NO
AND CSB.DOC_NO = CS.DOC_NO
AND CSB.AGREEMENT_ID = CS.AGREEMENT_ID
AND CSB.CUST_SCHEDULE_TYPE = CS.CUST_SCHEDULE_TYPE;
我收到错误:
Error at Command Line : 3 Column : 1
Error report -
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 - "SQL command not properly ended"
*Cause:
*Action:
我确定这一定是语法问题,但看不到在哪里。有任何想法吗?
编辑 - 谢谢,已获得解决方案。出于学习目的(我在过去 20 年中完成了 T-SQL,并且只学习了 PL-SQL),我还将查询重写为 MERGE INTO ——但这也失败了。这里有什么明显的问题吗?:
MERGE INTO IC_U_CUSTOMER_SCHED_B CSB
USING CUST_SCHED CS
ON (CSB.CUSTOMER_NO = CS.CUSTOMER_NO
AND CS.SHIP_ADDR_NO = CSB.SHIP_ADDR_NO
AND CSB.CUSTOMER_PART_NO = CS.CUSTOMER_PART_NO
AND CSB.DOC_NO = CS.DOC_NO
AND CSB.AGREEMENT_ID = CS.AGREEMENT_ID
AND CSB.CUST_SCHEDULE_TYPE = CS.CUST_SCHEDULE_TYPE)
WHEN MATCHED THEN UPDATE SET CSB.IFS10_SCHEDULE = CS.SCHEDULE_NO
WHERE CSB.IFS10_SCHEDULE != CS.SCHEDULE_NO;
解决方案
应该
UPDATE ic_u_customer_sched_b csb
SET csb.ifs10_schedule =
(SELECT cs.schedule_no
FROM cust_sched cs
WHERE csb.customer_no = cs.customer_no
AND cs.ship_addr_no = csb.ship_addr_no
AND csb.customer_part_no = cs.customer_part_no
AND csb.doc_no = cs.doc_no
AND csb.agreement_id = cs.agreement_id
AND csb.cust_schedule_type = cs.cust_schedule_type);
推荐阅读
- ruby-on-rails - Rails/Slim_Dynamic 数据标签属性
- python - 以 NETCDF4 格式编写 netCDF 时 Python 冻结,但 NETCDF3_CLASSIC 格式工作正常
- java - 可序列化的 Object.class
- reactjs - 刷新后反应路线丢失
- mysql - 如何使用spring boot在mysql中添加这种格式2019-2020?
- laravel - laravel websocket 包未在 laravel 5.8 中连接
- javascript - 为什么这个异步函数没有异步运行?
- python - 如何正确调用 psycopg2 中的函数
- java - Java 运算符的正确顺序是什么?
- java - Spring Boot - 避免控制器中的并发写访问