首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PLSQL合并-在不存在行时更新

PLSQL合并-在不存在行时更新
EN

Stack Overflow用户
提问于 2015-04-06 13:57:38
回答 3查看 68关注 0票数 1

我有三个桌子用户,办公室和一个角色地图。用户Id将是针对office经理和办公室主管的到Office表的FK。角色和用户Id将映射到角色映射表中,如下所示。删除office时,office表的活动列将更新为'N‘。当办公室被删除时,我必须检查办公室经理是否作为任何其他办公室的办公室经理。(同一个人也可以是另一个市场的经理)如果他不是,那么我必须删除角色映射表中的条目,将活动标志更新为'N‘。

表用户

代码语言:javascript
复制
User ID | User Name |
--------------------------
1       |   Mark    |

2       |   George  |

3       |   Rick    |

4       |   Alex    |

表厅

代码语言:javascript
复制
Office ID   | Office Name   | Office Manager| Office Head   |   Active  |
---------------------------------------------------------------------------
1           |   Off1        |   1           |   2           |   Y       |

2           |   Off2        |   1           |   4           |   Y       |

角色映射

代码语言:javascript
复制
User ID |   User Role       |   Active  |
---------------------------------------------
    1   |   Office Manager  |   Y       |

    2   |   Office Head     |   Y       |

    4   |   Office Head     |   Y       |

因此,在这个示例中,如果我删除Office 2,那么我需要将角色映射表中的第三个条目更新为下面的OFfice管理器角色映射,因为相同的用户也是Off1的管理器。

角色地图--更新后

代码语言:javascript
复制
User ID |   User Role       |   Active  |
-------------------------------------------
    1   |   Office Manager  |   Y       |

    2   |   Office Head     |   Y       |

    4   |   Office Head     |   N       |

我不知道如何在pl/sql中实现这个查询。有人能带我到这里来吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-06 15:11:26

我认为在这种情况下不使用merge会更安全。删除office或将其状态更新为非活动后,只需运行此update

代码语言:javascript
复制
update role_map set active = 'N'
  where (user_role = 'Office Head' 
    and not exists (
      select 1 from office 
        where office_head = role_map.user_id and active = 'Y'))
    or (user_role = 'Office Manager' 
    and not exists (
      select 1 from office 
        where office_manager = role_map.user_id and active = 'Y'));

我不确定是否需要表role_map,也许可以用视图替换它,但也许可以存储一些其他数据。

票数 2
EN

Stack Overflow用户

发布于 2015-04-06 15:10:38

如果您已经从OFFICE表中删除了行,则只需检查OFFICE表中的员工是否有活动角色,只需执行以下简单的更新-

代码语言:javascript
复制
UPDATE ROLE_MAP 
   SET active='N' 
 where user_id not in 
    (SELECT office_manager from office
     UNION ALL 
     SELECT office_head from office)
票数 1
EN

Stack Overflow用户

发布于 2015-04-06 15:20:46

PLSQL合并-在不存在行时更新

我不认为当在MERGE语句中与不匹配时,您无法使用进行更新。

为了避免每次删除之后进行手动更新,您可以在office表上创建删除触发器之后的,这样每当您从office表中删除一行时,都可以更新role_map表。update语句如下所示:

代码语言:javascript
复制
UPDATE role_map SET active = 'N' WHERE user_id = :OLD.office_head;

例如,只是一个伪代码

代码语言:javascript
复制
CREATE OR REPLACE TRIGGER office_trg
AFTER DELETE
   ON office
   FOR EACH ROW

DECLARE
   -- variable declarations

BEGIN

   -- check any conditions if required

   UPDATE role_map SET active = 'N' WHERE user_id = :OLD.office_head;

EXCEPTION
   WHEN ...
   -- exception handling

END;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29472731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档