联接查询更新

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

【讨论】:

以上是关于联接查询更新的主要内容,如果未能解决你的问题,请参考以下文章

如何编写包含联接、更新和排序的查询?

带有内部联接和子查询的 Microsoft Access 更新语句

与某些表联接时更新查询的语法错误

BigQuery:使用子查询和内部联接的计数更新行

如何在单个查询中使用联接和聚合函数更新表中的多行

在 Oracle 上使用内部联接更新语句