【问题标题】:Copying data from one row to another in the same column based on another column not being NULL基于另一列不为 NULL 将数据从同一列中的一行复制到另一行
【发布时间】:2023-03-16 18:15:01
【问题描述】:

我遇到了一个表的问题,该表的某些行缺少数据,我需要从与标题匹配的另一行复制 Artist 列

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 语句:

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

最终结果是 TOP 1 Artist 被复制到所有 NULL Artist 列,而不是具有匹配 Title 的 Artist。

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

Artist 为 NULL 的行可以在表中的任何位置,并且不严格低于具有相同标题的完整行。

谢谢!

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您需要对 title 列进行表格限定,因为这两个表格是相同的。 Title = t.Titlet.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
    

    【讨论】:

    • 好的,行得通!我确定我尝试过,但遇到了错误,但它刚刚运行并正确更新了测试表!
    【解决方案2】:

    我建议使用可更新的 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;
    

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 2017-11-23
      • 2019-10-14
      相关资源
      最近更新 更多