使用自连接更新

时间:2018-07-26 13:01:34

标签: sql oracle

我在oracle中具有如下表结构:

create table uet_tmp_course
(
    "COURSE_ID" NUMBER(4,0) NOT NULL ENABLE, 
    "CODE" VARCHAR2(10 BYTE) NOT NULL ENABLE, 
    "TITLE" VARCHAR2(50 BYTE) NOT NULL ENABLE, 
    "CREDIT_HRS" NUMBER(4,2) NOT NULL ENABLE, 
    "LEVEL_ID" NUMBER(2,0),
  "STATUS" NUMBER(2,0),
  "COURSE_TYPE_ID" VARCHAR2(50 BYTE), 
  "EQUIVALENCE" VARCHAR2(10 BYTE),
  "LAB_CODE" VARCHAR2(10 BYTE),

     CONSTRAINT "PK_COURSE1" PRIMARY KEY ("COURSE_ID"),

     CONSTRAINT "UK_COURSE_CODE1" UNIQUE ("CODE")
);

我想用course_id而不是代码更新lab_code列的值(即第8列)。例如,在第一行而不是“ SE-101L”中,我想要有“ 102”,即“ SE-101L”的course_id。我尝试了联接,但是它们会导致错误,例如缺少括号或单行查询返回多行。如果有人可以帮助我,我会很高兴。 谢谢。

enter image description here

4 个答案:

答案 0 :(得分:1)

update uet_tmp_course set lab_code = (select course_id from uet_tmp_course where code = lab_code)应该做您想要的

答案 1 :(得分:1)

这将更新对应的course_id引用的lab_code

UPDATE a
FROM uet_tmp_course a
INNER JOIN uet_tmp_course b
ON a.LAB_CODE = b.CODE
SET a.LAB_CODE = b.course_id;

对于Oracle

UPDATE 
(SELECT t1.LAB_CODE as OLD, t2.course_id as NEW
 FROM uet_tmp_course t1
 INNER JOIN uet_tmp_course t2
 ON t1.LAB_CODE = t2.CODE
) t
SET t.OLD = t.NEW

您还可以采取其他措施来防止每次都更新行(也请注意在您的应用中对此进行管理):

alter table uet_tmp_course
add constraint FK_uet_tmp_course_lab
foreign key (lab_code) references uet_tmp_course(course_id)

答案 2 :(得分:0)

您可以尝试

UPDATE uet_tmp_course
SET lab_code = (select course_id
                from uet_tmp_course
                where code=lab_code);

答案 3 :(得分:0)

您应使用以下语法( tab 区分 tab.lab_code 列来自外部表):

update uet_tmp_course tab
   set tab.lab_code = (select course_id
                         from uet_tmp_course
                        where code = tab.lab_code)