sql - 使用特定列相同的另一行的值更新列值
问题描述
我有一张桌子:
CREATE TABLE STOTMARS
(
KODAS integer NOT NULL,
PUNKTAS varchar(50) NOT NULL,
MARS varchar(10) NOT NULL,
EILNR integer NOT NULL,
METRAI integer NOT NULL,
VIDGR integer NOT NULL,
TARPINIS varchar(1),
CONSTRAINT STOTMARS_ID PRIMARY KEY (KODAS,PUNKTAS,MARS,EILNR)
);
CREATE INDEX STOTMARS_EILNR ON STOTMARS (EILNR);
CREATE INDEX STOTMARS_KODAS ON STOTMARS (KODAS);
CREATE INDEX STOTMARS_MARS ON STOTMARS (MARS);
CREATE INDEX STOTMARS_PUNKTAS ON STOTMARS (PUNKTAS);
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
ON STOTMARS TO SYSDBA WITH GRANT OPTION;
我需要更新 PUNKTAS = 'Dvaro st.3' 行中的 EILNR 值,其中 EILNR 值来自具有相同 KODAS 值和 PUNKTAS 值为 'Centro st.1' 的行
到目前为止,我尝试过:
update STOTMARS a
set a.EILNR = (
select
b.EILNR
from STOTMARS b
where a.PUNKTAS = 'Centro st.1' and a.MARS = b.MARS
)
where a.PUNKTAS = 'Dvaro st.3'
但这给了我错误:
Executing statement...
Error: *** IBPP::SQLException ***
Context: Statement::Execute( update STOTMARS a
set a.EILNR = (
select
b.EILNR
from STOTMARS b
where a.PUNKTAS = 'Centro st.1' and a.MARS = b.MARS
)
where a.PUNKTAS = 'Dvaro st.3' )
Message: isc_dsql_execute2 failed
SQL Message : -625
The insert failed because a column definition includes validation constraints.
Engine Code : 335544347
Engine Message :
validation error for column EILNR, value "*** null ***"
Total execution time: 0.000s
为了使查询更清晰:
select
a.MARS, a.EILNR, b.EILNR
from STOTMARS a
join STOTMARS b
on a.MARS = b.MARS and b.PUNKTAS = 'Dvaro st.3'
where a.PUNKTAS = 'Centro st.1'
给了我一个表格,其中每个第三列的值都应该替换为该行的第二列值。
解决方案
问题是内部选择不产生任何行,因此更新尝试分配null
,因为应用的条件是互斥的,并且由于对 的NOT NULL
约束而失败EILNR
:
update STOTMARS a
set a.EILNR = (
select
b.EILNR
from STOTMARS b
where a.PUNKTAS = 'Centro st.1' and a.MARS = b.MARS
)
where a.PUNKTAS = 'Dvaro st.3'
a.PUNKTAS
不能'Centro st.1'
和'Dvaro st.3'
同时。内部选择中的条件可能应该使用b.PUNKTAS
:
where b.PUNKTAS = 'Centro st.1' and a.MARS = b.MARS
您可能还想考虑使用MERGE
此相关更新来代替。
推荐阅读
- ios - Swift - 在应用程序中显示来电者姓名
- omnet++ - 使用 MODE=release 构建 simuLTE 时出错
- node.js - 私有存储库的作用域 NPM 将斜杠“/”转换为“%2F”
- sql - 隐蔽左连接到简单连接
- azure - 如何在 Azure DevOps 中获取 keyvault 机密输出
- apache-flink - 尝试使用上传的 jar 开始新作业时出现 Flink REST API POST 错误
- windows - electron builder:如何在 NSIS 安装程序中自定义字符串值?
- c - Linux 中的 sighandler_t typedef 语句?
- javascript - 使用另一个对象在 React 中搜索对象
- c# - Xamarin.Forms Picker ItemDisplayBinding 不使用静态列表