繁体   English   中英

如何使用CTE对列进行条件更新?

[英]How to do conditional update on columns using CTE?

我有一个具有以下布局的表CUST 没有任何限制。 我确实看到一个ChildID与一个以上的ParentID相关联。 (请参阅ChildID = 115的记录)

这是我需要的-

无论一个孩子的父母多于1个,我都想用具有最大match_perParentIDParentName更新那些ParentIDParentName 因此,在下图中,我希望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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM