Oracle sql - 在同一个表中标识和更新主行和辅助行

时间:2014-10-03 14:58:20

标签: sql oracle

我有一个场景,我需要识别重复记录的组合,并使用它们来标记和识别哪个是主要的,哪个是次要的,然后使用附加列来更新密钥。这将帮助我更新另一个具有参照完整性的子表。这是一个例子

Table Member

ID Name Birthdt  MID
1  SK   09/1988  312
2  SK   09/1988  999
3  SL   06/1990  315
4  GK   08/1990  316
5  GK   08/1990  999

所以从上面的表中我识别重复的逻辑是 - 我在Name和Birthdate上做一个组,当MID是999时我认为是重复的

所以我创建了另一个临时表来捕获重复项。

Table member_dups
ID NAME BIRTHDT MID M_flg M_Key

1  SK   09/1988      P        1
2  SK   09/1988      S        1
4  GK   08/1990      P        4
5  GK   08/1990      S        4

对于我的表member_dups我能够加载重复记录并更新标志。但是,我发现很难为标记为次要的记录获得正确的M_KEY。如果我可以实现这一点,那么我可以采取该记录并相应地更新另一个表。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

如果我理解你的逻辑,那么MID = 999的记录就是member_dups中的次要记录。

如果是这样,您应该能够使用加入的简单更新:

update member_dups
set m_key = m.id
from member_dups md
inner join Member m on m.name = mb.name and m.birthdt = mb.birthdt
where mb.m_flg = 's' and m.mid = 999

此示例使用MSSQL语法,因此不是有效的Oracle语法,但您应该明白这一点,并希望您比我更了解Oracle。我将尝试找出正确的Oracle语法并尽快更新答案。

编辑:我认为这是有效的Oracle语法,但我无法测试它:

MERGE INTO member_dups 
USING 
(
  SELECT id,
         name,
        birthdt
  FROM Member
  where m.mid = 999
) m ON (m.name = mb.name and m.birthdt = mb.birthdt and mb.m_flg = 's')
WHEN MATCHED THEN UPDATE 
    SET member_dups.m_key  = m.id