首页 > 解决方案 > 使用特定列相同的另一行的值更新列值

问题描述

我有一张桌子:

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'

给了我一个表格,其中每个第三列的值都应该替换为该行的第二列值。

标签: sqlsql-updatefirebird

解决方案


问题是内部选择不产生任何行,因此更新尝试分配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此相关更新来代替。


推荐阅读