【问题标题】:Query for updating a column in same table from same table查询从同一张表更新同一张表中的列
【发布时间】:2017-03-29 08:26:32
【问题描述】:

我必须更新匹配的 authorid 列(其中 documentculture = 'en-US'

匹配(其中 documentculture = 'el-GR' 在同一个表中。包括到另一个表的内部连接

我写的像下面这样看起来不对:

  UPDATE t1
  SET t1.authorid = t2.authorid
  FROM wv_blogdata AS t1
  INNER JOIN wv_blogdata AS t2
  ON t1.documentnodeid = t2.documentnodeid
  inner join CMS_Document d
  ON d.BlogDataID = d.DocumentForeignKeyValue
  WHERE t2.DocumentCulture = 'en-US';

你能纠正我吗?

更多解释:

select authorid from wv_blogdata 
inner join CMS_Document 
on wv_blogdata.BlogDataID = CMS_Document.DocumentForeignKeyValue
Where DocumentCulture ='el-GR'

以上查询的作者ID与以下查询的authorid不同 我想让它同步

select authorid from wv_blogdata 
inner join CMS_Document 
on wv_blogdata.BlogDataID = CMS_Document.DocumentForeignKeyValue
Where DocumentCulture ='en-US'

【问题讨论】:

  • 假设我了解数据结构,请尝试将 AND t1. DocumentCulture ='el-GR' 添加到更新语句的 where 子句中。
  • 你能发布完整的查询吗?
  • 如果您可以编辑您的问题以将示例数据包含为 ddl + dml 和所需结果,我可以编写一个完整的、可测试的查询。
  • @SmartestVEGA,请检查我刚刚发布的答案。它应该工作。如果您发现任何问题,请告诉我。

标签: sql sql-server tsql


【解决方案1】:

正如 Zohar Peled 在 cmets 中所说,除非您提供样本数据、预期结果以及您当前的 DML,否则很难为您的问题提供准确的答案。

话虽如此,一般而言,如果您可以使用表别名生成一个选择语句,该语句同时显示要更新的字段和具有新值的字段,那么您可以将其用作成功 UPDATE 查询的基础。

因此,如果此查询中显示正确的结果(您的原始转换为 SELECT):

    SELECT t1.authorid AS OldValue, t2.authorid AS NewValue
      FROM wv_blogdata AS t1
INNER JOIN wv_blogdata AS t2
        ON t1.documentnodeid = t2.documentnodeid
INNER JOIN CMS_Document d
        ON d.BlogDataID = d.DocumentForeignKeyValue
     WHERE t2.DocumentCulture = 'en-US';

你将从这个查询中得到正确的结果(你原来的):

    UPDATE t1
       SET t1.authorid = t2.authorid
      FROM wv_blogdata AS t1
INNER JOIN wv_blogdata AS t2
        ON t1.documentnodeid = t2.documentnodeid
INNER JOIN CMS_Document d
        ON d.BlogDataID = d.DocumentForeignKeyValue
     WHERE t2.DocumentCulture = 'en-US';

当然要记住测试你的工作是否有意想不到的结果和隐藏的陷阱。

同样,如果没有足够的样本数据,很难给您一个明确的答案,因此请尽可能详细地提供帮助我们为您提供帮助。

希望这可以帮助您解决问题。

【讨论】:

    【解决方案2】:

    以下查询应该使记录同步,因此在您运行此查询后,德国博客的 authorid 和美国博客的 authorid 将变得相同。

    请注意,top(1) 是必需的,因此子查询只返回一个值,否则如果有多个德国文化的博客记录,您将遇到错误。

    UPDATE b  
    SET b.authorid =
      (SELECT top(1) wvb.authorid
       FROM wv_blogdata wvb
       INNER JOIN CMS_Document cms ON wvb.BlogDataID = cms.DocumentForeignKeyValue
       WHERE cms.DocumentCulture ='el-GR' AND b.BlogDataID = cms.DocumentForeignKeyValue order by wvb.authorid)
     FROM wv_blogdata b
      INNER JOIN CMS_Document  ON b.BlogDataID = CMS_Document.DocumentForeignKeyValue
    WHERE CMS_Document.DocumentCulture ='en-US';
    

    【讨论】:

    • 文档文化在 CMS_document 表中
    • 美国博客 authorid 设置为德国博客 authorid。这不就是你想要的结果吗?
    • 对于不同的 DocumentForeignKeyValue 有多个相同文化的作者 ID,所以它应该匹配 wv_blogdata.BlogDataID = document.DocumentForeignKeyValue
    • 然后,在子查询中为此添加一个额外的条件。有时间我会更新的。
    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2017-08-28
    相关资源
    最近更新 更多