联接查询更新
Posted 丹心石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了联接查询更新相关的知识,希望对你有一定的参考价值。
Oracle 实现多表参照更新
参照T2 修改 T1
表1
表2
- 方法1
update student set grade=(select grade from gradedetial where sid=student.id and rownum=1)
where exists(select count(1) from gradedetial where sid=student.id)
如果同时更新多个字段可以参照语法:
update tb1 t1 set(字段1,字段2,...)=(select 字段1,字段2... from tb2 t2 where t2.id=t2.id)
where exists(select count(1) from t2 where t2.id=t1.id)
- 方法2 内联视图更新(要求取数据的表即T2,该字段必须是主键或者有唯一约束),上表不具备这个条件,因此这个方法在这里会失败!
update (select a.grade grade1,b.grade grade2 from student a inner join gradedetial b
on a.id=b.sid) t
set grade1=grade2;
带有内部联接的 SQL 更新查询语法
【中文标题】带有内部联接的 SQL 更新查询语法【英文标题】:SQL update query syntax with inner join 【发布时间】:2011-04-21 11:55:44 【问题描述】:谁能在这个查询中找到我的错误?我正在使用 SQL Server 2000,我想将 CostEntry 表中的所有条目更新为 ActiveCostDetails 表中的相应值。 where 子句确实适用于 select 语句。
UPDATE CostEntry CE
INNER JOIN ActiveCostDetails As AD ON CostEntry.lUniqueID = ActiveCostDetails.UniqueID
SET CostEntry.sJobNumber = ActiveCostDetails.JobNumber
WHERE CostEntry.SEmployeeCode = '002'
AND SubString(CostCentre, 1, 1) = sDepartmentCode
AND substring(CostCentre, 3, 1) = sCategoryCode
AND substring(CostCentre, 5, 2) = sOperationCode
【问题讨论】:
@OMG Ponies- 感谢您的关注,但此查询与原始查询具有相同的效果(由于语法错误而无法正常工作)。我相信这是因为 SQL Server 在查询中忽略了空格和回车。 我刚刚重新格式化了您发布的内容——更易于阅读,更易于帮助 好的小马,我明白了。我正在研究一个在线示例...tek-tips.com/faqs.cfm?fid=1958 但你的方式更好。 【参考方案1】:SET
需要位于查询的 FROM\JOIN\WHERE
部分之前。
UPDATE CE
SET sJobNumber = AD.JobNumber
FROM CostEntry CE
INNER JOIN ActiveCostDetails As AD
ON CE.lUniqueID = AD.UniqueID
WHERE CE.SEmployeeCode = '002'
AND SubString(CostCentre, 1, 1) = sDepartmentCode
AND substring(CostCentre, 3, 1) = sCategoryCode
AND substring(CostCentre, 5, 2) = sOperationCode
【讨论】:
+1:SS2000 Update documentation @Joe Stefanelli - 关闭,但解析器不喜欢设置别名时的名称。 这项工作:更新 CE SET CE.sJobNumber = AD.JobNumber FROM CostEntry CE INNER JOIN ActiveCostDetails As AD ON CE.lUniqueID = AD.UniqueID WHERE CE.SEmployeeCode = '002' AND SubString(CostCentre, 1, 1) = sDepartmentCode AND substring(CostCentre, 3, 1) = sCategoryCode AND substring(CostCentre, 5, 2) = sOperationCode @MAW74656:我知道我的眼睛随着年龄的增长越来越差,但这不是我给你的吗? @Joe Stefanelli - 嗯,你的权利。也许我是那个眼睛不好的人!【参考方案2】:一旦为表设置了别名,就不能使用表名。以这种方式尝试您的查询,它会起作用。
UPDATE CostEntry CE
INNER JOIN
ActiveCostDetails AD
ON (CE.lUniqueID = AD.UniqueID)
SET CE.sJobNumber = AD.JobNumber
WHERE CE.SEmployeeCode = '002'
AND SubString(CostCentre, 1, 1) = sDepartmentCode
AND substring(CostCentre, 3, 1) = sCategoryCode
AND substring(CostCentre, 5, 2) = sOperationCode
【讨论】:
在 MySQL 的情况下是这样【参考方案3】:这应该可以工作
UPDATE CE
SET CostEntry.sJobNumber = ActiveCostDetails.JobNumber
FROM CostEntry CE
INNER JOIN ActiveCostDetails As AD ON CostEntry.lUniqueID = ActiveCostDetails.UniqueID
WHERE CostEntry.SEmployeeCode = '002'
AND SubString(CostCentre, 1, 1) = sDepartmentCode
AND substring(CostCentre, 3, 1) = sCategoryCode
AND substring(CostCentre, 5, 2) = sOperationCode
【讨论】:
以上是关于联接查询更新的主要内容,如果未能解决你的问题,请参考以下文章