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;
好的,行了!我确信我试过了,但是得到了一个错误,但是它刚刚运行,并且正确地更新了测试表!好的,行了!我确信我试过了,但是得到了一个错误,但是它刚刚运行,并且正确地更新了测试表!