带有内部联接的 SQL 更新查询语法

Posted

技术标签:

【中文标题】带有内部联接的 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

【讨论】:

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

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

LINQ to SQL 中的内部联接的语法是啥?

带有内部联接的sql更新和位置

将 Access SQL 内部联接查询转换为 mySQL 查询的问题

带有内部联接的 SQL Server 更新

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