查询从同一个表更新同一个表中的列

时间:2017-03-29 08:26:32

标签: sql sql-server tsql

我必须更新匹配的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'

2 个答案:

答案 0 :(得分:0)

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

话虽如此,一般而言,如果您可以使用表别名显示要更新的字段和带有新值的字段的select语句,那么您可以将其用作成功更新查询的基础。 / p>

因此,如果此查询中显示了正确的结果(原始转换为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';

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

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

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

答案 1 :(得分:0)

以下查询应使记录同步,以便在运行此查询后,德国博客和美国博客的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';