更新与其他列具有一个或多个相同值的列值
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
只更新分配的行(如果有的话)。
【讨论】:
以上是关于更新与其他列具有一个或多个相同值的列值的主要内容,如果未能解决你的问题,请参考以下文章