Sql 基于另一列不为空,将数据从一行复制到同一列中的另一行

Sql 基于另一列不为空,将数据从一行复制到同一列中的另一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表的问题,该表的某些行缺少数据,我需要从另一个与标题匹配的行复制艺术家列 Plays | Title | Artist ------+--------------------------+---------------- 107 | Superstition | Stevie Wonder 96 | Superstition | NULL 158 | Patience

我有一个表的问题,该表的某些行缺少数据,我需要从另一个与标题匹配的行复制艺术家列

Plays |  Title                   |  Artist
------+--------------------------+----------------
107   |  Superstition            |  Stevie Wonder
96    |  Superstition            |  NULL
158   |  Patience                |  Guns n Roses
9     |  Patience                |  NULL
112   |  Promised You A Miracle  |  Simple Minds
99    |  Promised You A Miracle  |  NULL
159   |  Baker Street            |  Gerry Rafferty
132   |  Baker Street            |  NULL
我已经在SO上阅读了一系列其他问题,这些问题让我产生了以下更新声明:

UPDATE MetaDataTable
SET Artist = (SELECT TOP 1 Artist FROM MetaDataTable t 
              WHERE (Title = t.Title) AND t.Artist IS NOT NULL)
WHERE Artist IS NULL
结果是前1名艺术家被复制到所有空艺术家列,而不是标题匹配的艺术家

Plays |  Title                   |  Artist
------+--------------------------+----------------
107   |  Superstition            |  Stevie Wonder
96    |  Superstition            |  Stevie Wonder
158   |  Patience                |  Guns n Roses
9     |  Patience                |  Stevie Wonder
112   |  Promised You A Miracle  |  Simple Minds
99    |  Promised You A Miracle  |  Stevie Wonder
159   |  Baker Street            |  Gerry Rafferty
132   |  Baker Street            |  Stevie Wonder
我想要的是:

Plays |  Title                   |  Artist
------+--------------------------+----------------
107   |  Superstition            |  Stevie Wonder
96    |  Superstition            |  Stevie Wonder
158   |  Patience                |  Guns n Roses
9     |  Patience                |  Guns n Roses
112   |  Promised You A Miracle  |  Simple Minds
99    |  Promised You A Miracle  |  Simple Minds
159   |  Baker Street            |  Gerry Rafferty
132   |  Baker Street            |  Gerry Rafferty
带NULL Artist的行可以位于表中的任何位置,并且不能严格位于具有相同标题的完整行的下方


谢谢

由于两个表相同,您需要对
标题
列进行表格限定
Title=t.Title
t.Title=t.Title
相同,因为最匹配的列是子查询中的表,而不是正在更新的表。将其更改为
MetaDataTable.Title=t.Title

UPDATE MetaDataTable
   SET Artist = (SELECT TOP 1 Artist FROM MetaDataTable t WHERE MetaDataTable.Title = t.Title AND t.Artist IS NOT NULL)
WHERE Artist IS NULL

您需要对
标题
列进行表格限定,因为这两个表格是相同的
Title=t.Title
t.Title=t.Title
相同,因为最匹配的列是子查询中的表,而不是正在更新的表。将其更改为
MetaDataTable.Title=t.Title

UPDATE MetaDataTable
   SET Artist = (SELECT TOP 1 Artist FROM MetaDataTable t WHERE MetaDataTable.Title = t.Title AND t.Artist IS NOT NULL)
WHERE Artist IS NULL

我建议使用可更新的CTE:

WITH toupdate as (
      SELECT mdt.*,
             MAX(mdt.artist) OVER (PARTITION BY mdt.title) as imputed_artist
      FROM MetaDataTable mdt
     )
UPDATE toupdate
   SET Artist = imputed_artist
WHERE Artist IS NULL;

我建议使用可更新的CTE:

WITH toupdate as (
      SELECT mdt.*,
             MAX(mdt.artist) OVER (PARTITION BY mdt.title) as imputed_artist
      FROM MetaDataTable mdt
     )
UPDATE toupdate
   SET Artist = imputed_artist
WHERE Artist IS NULL;

好的,行了!我确信我试过了,但是得到了一个错误,但是它刚刚运行,并且正确地更新了测试表!好的,行了!我确信我试过了,但是得到了一个错误,但是它刚刚运行,并且正确地更新了测试表!