Sql 使用自连接更新

Sql 使用自连接更新,sql,oracle,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"

我在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")
);
我想用课程id而不是代码更新列lab_代码的值,即第8列。例如,在第一行中,我希望使用“102”,而不是“SE-101L”,即“SE-101L”的课程id。我尝试过连接,但它们会导致错误,如缺少括号或单行查询返回多行。如果有人能帮忙,我会很高兴的。 多谢各位

你可以试试

UPDATE uet_tmp_course
SET lab_code = (select course_id
                from uet_tmp_course
                where code=lab_code);
你可以试试

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

更新uet_tmp_课程集实验室代码=从uet_tmp_课程中选择课程id,其中代码=实验室代码应该做你想做的事

更新uet_tmp_课程集实验室代码=从uet_tmp_课程中选择课程id,其中代码=实验室代码应该做你想做的事

这将更新相应实验室代码的参考课程id

甲骨文

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)

这将更新相应实验室代码的参考课程id

甲骨文

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)

您应该使用此语法选项卡区分列tab.lab\u代码来自外部表:

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

您应该使用此语法选项卡区分列tab.lab\u代码来自外部表:

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


你能告诉我们你试过的东西吗?这样我们就可以帮助你找到解决方案更新选择b.course_id作为新代码,a.course_id作为旧代码从uet_tmp_课程a左加入uet_tmp_课程b在a.lab_代码=b.code按b.course_id设置t.old=t.new_代码;这将导致“t.new_code”无效标识符错误您知道今天的数据不匹配,第1行有第2行的实验室_代码吗?但也许这就是你想要改变它的原因。请阅读并接受它answer@JoakimDanielson,实验室代码是课程提供实验室的课程id。因此,是的,我想将其更新为各个实验室的课程id。您能告诉我们您尝试过的东西,以便我们可以帮助您获得解决方案更新选择b.课程id作为新的课程代码,a、 课程id从uet_tmp_课程a左加入uet_tmp_课程b在a.lab_代码=b.code按b.course_id t设置t.old=t.new_代码;这将导致“t.new_code”无效标识符错误您知道今天的数据不匹配,第1行有第2行的实验室_代码吗?但也许这就是你想要改变它的原因。请阅读并接受它answer@JoakimDanielson,实验室代码是课程提供实验室的课程id。因此,是的,我想将其更新为各个实验室的课程id。谢谢您的回复。此查询不会提供所需的结果,而是将实验室代码更新为相应行的课程id。感谢您的回复。此查询不会提供所需的结果,而是将实验室代码更新为相应行的课程id。感谢您的回复。这将导致null。lab_代码的整个列现在更新为'null'大sry。forgott关于别名的问题。谢谢你的回复。这将导致null。lab_代码的整个列现在更新为'null'大sry。关于别名,这不是mssql语法吗。我认为oracle不支持加入更新。是的。谢谢你的观察。我为Oracle添加了sintax谢谢你的回复。查询导致set关键字丢失错误。这个表是用于细化数据的临时表,这就是我没有应用任何约束的原因。在构造最终表时,我将记住这个约束。再次感谢:感谢您提供oracle版本的查询。它起作用了。非常感谢你如果你不介意我问的话,这是我在这里发帖之前最初提出的问题。更新选择b.course_id作为新代码,a.course_id作为旧代码从uet_tmp_课程a左加入uet_tmp_课程b在a.lab_代码=b.code按b.course_id t设置t.old=t.new_代码;但这一直给我一个错误,即最后一个等号之后的术语永远不会被识别。为什么呢?你能解释一下吗。我问这个问题是因为你的查询看起来和我的非常相似,而且工作非常好。这不是mssql语法吗。我认为oracle不支持加入更新。是的。谢谢你的观察。我为Oracle添加了sintax谢谢你的回复。查询导致set关键字丢失错误。这个表是用于细化数据的临时表,这就是我没有应用任何约束的原因。在构造最终表时,我将记住这个约束。再次感谢:感谢您提供oracle版本的查询。它起作用了。非常感谢你如果你不介意我问的话,这是我在这里发帖之前最初提出的问题。更新选择b.course_id作为新代码,a.course_id作为旧代码从uet_tmp_课程a左加入uet_tmp_课程b在a.lab_代码=b.code按b.course_id t设置t.old=t.new_代码;但这一直给我一个错误,即最后一个等号之后的术语永远不会被识别。为什么呢?你能解释一下吗。我在问
这是因为您的查询与我的查询非常相似,而且工作绝对正常。没问题:我很高兴我能帮上忙@Rida我很高兴我们作为堆栈溢出用户成功地帮助了您。话虽如此,看到一个人的答案被认为是正确的,而且在答案被标注为正确之前被正确地写下,然后被忽略,这有点让人泄气。没问题我很高兴我能帮上忙@Rida我很高兴我们作为堆栈溢出用户成功地帮助了您。话虽如此,看到一个人的答案被认为是正确的,在答案被贴上正确标签之前被正确地写下,然后被忽略,这有点让人泄气。