使用特定列相同的另一行的值更新列值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用特定列相同的另一行的值更新列值相关的知识,希望对你有一定的参考价值。

我有一张桌子:

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而不是此相关更新。

另一答案

你可以通过几种方式避免使用NULL。一种方法是用适当的值替换值:

update STOTMARS a
    set a.EILNR = (select coalesce(max(b.EILNR), 0)
                   from STOTMARS b
                   where a.PUNKTAS = 'Centro st.1' and a.MARS = b.MARS
                  )
    where a.PUNKTAS = 'Dvaro st.3';

或者,添加比较子句:

update STOTMARS a
    set a.EILNR = (select coalesce(max(b.EILNR), 0)
                   from STOTMARS b
                   where a.PUNKTAS = 'Centro st.1' and a.MARS = b.MARS
                  )
    where a.PUNKTAS = 'Dvaro st.3' and
          (select b.EILNR
           from STOTMARS b
           where a.PUNKTAS = 'Centro st.1' and a.MARS = b.MARS
          ) is not null;

请注意,这不使用not exists,因此它可以考虑NULL值sin EILNR

以上是关于使用特定列相同的另一行的值更新列值的主要内容,如果未能解决你的问题,请参考以下文章

从前一行和特定列值有效地更新熊猫数据框中的 NaN

根据熊猫中的另一个列值有条件地填充列值

CodeIgniter 查询:如何将列值移动到同一行中的另一列并将当前时间保存在原始列中?

SQL / Hive 选择具有特定列值的第一行

从pickerview中的另一列确定一列值

通过选择 Pandas 中的其他列来更新条件列值