sql - MySQL从具有相同键的多行数据中更新1行

标签 sql sql-update row

是否可以更新另一个表中的单行,该表可能具有具有相同键值的多行数据?

数据的快速采样如下:

table TA
|  ID  |  Old_Text  |
| ---- | ---------- |
| 1040 | Text_1040A |
| 1045 | Text_1045A |
| 1045 | Text_1045B |
| 1050 | Text_1050A |


table TZ (before update)
|  ID  |  New_Text  |
| ---- | ---------- |
| 1040 |    NULL    |
| 1045 |    NULL    |
| 1050 |    NULL    |

我正在使用以下更新语句

UPDATE
  table TZ
SET
  TZ.New_Text =
    CASE 
        WHEN TZ.New_Text IS NULL THEN TA.Old_Text
        ELSE TZ.New_Text + ' ' + TA.Old_Text
    END
FROM 
  table TZ INNER JOIN table TA ON TZ.ID = TA.ID
WHERE TZ.ID = TA.ID

预期结果应该是 ID 1045 有两个值 (Text_1045A Text_1045B),其他值有 1。如下所示:

table TZ (after update)
|  ID  |          New_Text          |
| ---- | -------------------------- |
| 1040 |   Text_1040A               |
| 1045 |   Text_1045A Text_1045B    |
| 1050 |   Text_1050A               |

相反,我得到了这个:

table TZ (after update)
|  ID  |    New_Text     |
| ---- | --------------- |
| 1040 |   Text_1040A    |
| 1045 |   Text_1045A    |
| 1050 |   Text_1050A    |

我做错了什么或者不理解我认为更新的工作原理?

最佳答案

虽然最佳实践是首先避免重复(通过使用约束)。有时你无法阻止它们。下面我提供了一种获取您所描述的输出的方法。

此 SQL 连接文本和 RespectiveID 的更新。

这也会清除重复记录

SELECT 
    ID,
    (SELECT SUBSTRING(
    (SELECT ' ' + s.Old_Text
    FROM SampleTable s
    WHERE s.ID = sTable.ID
    --ORDER BY s.Old_Text
    FOR XML PATH('')),2,200000)) [Old_Text]
INTO #Updates
FROM SampleTable sTable
GROUP BY ID

UPDATE s
SET s.Old_Text = u.Old_Text
FROM SampleTable s
INNER JOIN #Updates u
    ON s.ID = u.ID


;WITH CTE 
AS
(
    SELECT ID, Old_Text, ROW_NUMBER() OVER(Partition BY ID ORDER BY ID) [Ranking]
    FROM SampleTable
)
DELETE FROM CTE
WHERE Ranking > 1

清理完所有重复项后,我强烈建议对该表施加一些限制,以防止这种情况继续发生。您不想将其作为维护例程无限期地运行。

关于sql - MySQL从具有相同键的多行数据中更新1行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66357969/

相关文章:

c# - 如何从sql中的每组中选择20个随机问题?

mysql - 在 mysql 的逗号分隔列表中搜索带有 id 的条目

MySQL 替换部分字符串

python - 使用 SqlAlchemy 和 PostgreSQL 更新 .. LIMIT 1

Excel vba宏根据单元格整数值多次复制行

jsp - 使用 Servlets 和 JSP 从 html 表中获取选定的行

mysql - 仅获取给定列值的一行

sql - 从与另一个表具有相同关系的表中获取字段

MySQL更新列+1?

google-apps-script - Google 表格脚本 - 将行从一个选项卡 move 到另一个选项卡