更新与其他列具有一个或多个相同值的列值

Posted

技术标签:

【中文标题】更新与其他列具有一个或多个相同值的列值【英文标题】:Update column value that has one or more same values of other column 【发布时间】:2020-02-19 13:42:01 【问题描述】:

我有这样的声明:

UPDATE `tblAllocatedLeads` 
SET tblAllocatedLeads.fldAllocatedStatus = CASE 
WHEN tblAllocatedLeads.fldAllocatedStatus = 'Allocated' 
AND 
(SELECT COUNT(*) FROM (SELECT * FROM `tblAllocatedLeads`) AS tblallocate WHERE AND tblallocate.fldAllocatedLeadId = tblAllocatedLeads.fldAllocatedLeadId) > 1 
THEN 'Outstanding' 
END

我想要的是将 fldAllocatedStatus = 'Allocated' 的所有行更新为 'Outstanding' 且列 fldAllocatedLeadId 具有一个或多个相同值的其他行。

我的数据

ID   fldAllocatedStatus   fldAllocatedLeadId
1    Accepted             123
2    Rejected             123
3    Allocated            123
4    Allocated            321

在这种情况下,ID = 3 应该将 fldAllocatedStatus 更新为“Outstanding”,因为它与 ID 有一个或多个相同的 fldAllocatedLeadId = 1,2

并且 ID = 4 应该保持“已分配”,因为它没有与其他行匹配的 fldAllocatedLeadId

现在它会更新 "Accepted,Rejected",它应该只更新具有 "Allocated"

的行

【问题讨论】:

用您正在使用的数据库标记您的问题。 与您的问题无关,但是:Is adding the ‘tbl’ prefix to table names really a problem? 【参考方案1】:

你不需要任何聚合,只需要一个自加入:

UPDATE tblAllocatedLeads t 
INNER JOIN tblAllocatedLeads tt
ON tt.id <> t.id AND tt.fldAllocatedLeadId = t.fldAllocatedLeadId 
SET t.fldAllocatedStatus = 'Outstanding' 
WHERE t.fldAllocatedStatus = 'Allocated';

请参阅demo。 结果:

| ID  | fldAllocatedStatus | fldAllocatedLeadId |
| --- | ------------------ | ------------------ |
| 1   | Accepted           | 123                |
| 2   | Rejected           | 123                |
| 3   | Outstanding        | 123                |
| 4   | Allocated          | 321                |

【讨论】:

这个效果很好,我想要的。非常感谢你!。感谢您的帮助。【参考方案2】:

假设 mysql,我想你想要:

UPDATE tblAllocatedLeads al JOIN
       (SELECT al2.fldAllocatedLeadId
        FROM tblAllocatedLeads al2
        WHERE al.fldAllocatedStatus <> 'Allocated'
        GROUP BY al2.tblAllocatedLeads
       ) al2
       ON al2.tblAllocatedLeads = al.tblAllocatedLeads
    SET al.fldAllocatedStatus = 'Outstanding'
    WHERE al.fldAllocatedStatus = 'Allocated' ;

子查询获取具有某些未分配值的线索。外部WHERE 只更新分配的行(如果有的话)。

【讨论】:

以上是关于更新与其他列具有一个或多个相同值的列值的主要内容,如果未能解决你的问题,请参考以下文章

连接具有相同值的行的列值(不同列的)

Ext JS:如何在具有多个列值的网格中查找记录

如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL

将两个具有相似列值的数据框合并在一起[重复]

计算具有与相同 ID 相关的不同列值的结果

Hive 查询以使用其他列值的总和获取前 3 列值