[英]How to do conditional update on columns using CTE?
我有一个具有以下布局的表CUST
。 没有任何限制。 我确实看到一个ChildID
与一个以上的ParentID
相关联。 (请参阅ChildID = 115
的记录)
这是我需要的-
无论一个孩子的父母多于1个,我都想用具有最大match_per
的ParentID
和ParentName
更新那些ParentID
和ParentName
。 因此,在下图中,我希望ParentID
1111和ParentName
LEE YOUNG WOOK更新ChildId = 115
所有记录(因为match_per
0.96在给定集中最大)。 如果有两个最大max_per相等的父母,那么我想选择其中一个。
我知道可以使用CTE,但我不知道如何更新CTE。 有人可以帮忙吗?
一种方法
WITH CTE1 AS
(
SELECT *,
CASE WHEN match_per =
MAX(match_per) OVER (PARTITION BY ChildId)
THEN CAST(ParentId AS CHAR(10)) + ParentName
END AS parentDetailsForMax
FROM CUST
), CTE2 AS
(
SELECT *,
MAX(parentDetailsForMax) OVER (PARTITION BY ChildId) AS maxParentDetailsForMax
FROM CTE1
)
UPDATE CTE2
SET ParentId = CAST(LEFT(maxParentDetailsForMax,10) AS int),
ParentName = SUBSTRING(maxParentDetailsForMax,10,8000)
同时获取父ID和父名称有些棘手。 我认为使用cross apply
最简单的逻辑是:
with toupdate as (
select t.*, p.parentId as new_parentId, p.parentName as new_parentName
max(match_per) over (partition by childid) as max_match_per,
count(*) over (partition by childid) as numparents
from table t cross apply
(select top 1 p.*
from table p
where p.childid = t.childid
order by match_per desc
) p
)
update toupdate
set parentId = new_ParentId,
parentName = new_ParentName
where numparents > 1;
注意:父代ID和父代名称都存储在表中的事实(可能多次存储)似乎是一个问题。 我希望根据给定的ID查找名称,以减少数据冗余。
尝试这样的事情? 第一个CTE将为每个ChildID获得Max(match_per)
。 然后,第二个将使用新的MaxMatchPer查找其对应的ParentID应该是什么。
; WITH CTE AS (
SELECT ChildID,MAX(match_per) AS MaxMatchPer
FROM tbl
GROUP BY ChildID
), CTE1 AS (
SELECT t.ParentID, c.ChildID
FROM tbl t
JOIN CTE c
ON c.ChildID = t.ChildID
AND c.MaxMatchPer = t.match_per
)
UPDATE t
SET ParentID = c.ParentID
FROM tbl t
LEFT JOIN CTE1 c
ON c.ChildID = t.ChildID
而且,这是不好的归一化。 该表中不应包含ParentName或ChildName。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.