sql数据表关联查询!

有2张数据表 人员表 和卡表
实际一个人员可能匹配多张卡
当员工离职时,管理员会把人员名下所有的卡的状态改为离职。

之前由于没有这么作有大量的人员状态未修改
想写一个查询语句 或者存储过程
去查询2张表关联后 符合员工名下所有卡片状态均失效的时候 对人员表的一个辅助字段更新内容为离职 之类
类似找到这样的人员,并且更新人员表的某个字段

img

您好,您可以通过使用SQL语句以及关联查询来实现您所需的功能。具体步骤如下:

  1. 首先需要查询符合员工名下所有卡片状态均失效的员工。假设人员表为employee,卡表为card,并且两张表是通过employee_id关联的,可以使用如下的查询语句:
SELECT e.employee_id FROM employee e
WHERE NOT EXISTS (
  SELECT 1 FROM card c
  WHERE c.employee_id = e.employee_id AND c.status != '失效'
)

以上查询语句的含义是,在employee表中查询,对于每一个员工,如果该员工名下存在一张卡状态不是失效,则不符合要求。使用EXISTSNOT EXISTS子查询可以方便地判断员工名下是否存在状态不是失效的卡。

  1. 找到符合要求的员工之后,可以使用UPDATE语句将这些员工的状态修改为离职。假设需要将员工的状态更新为离职,则可以使用如下的UPDATE语句:
UPDATE employee
SET status = '离职'
WHERE employee_id IN (
  SELECT e.employee_id FROM employee e
  WHERE NOT EXISTS (
    SELECT 1 FROM card c
    WHERE c.employee_id = e.employee_id AND c.status != '失效'
  )
)

以上查询语句的含义是,在employee表中查询符合前面查询条件的员工,并将这些员工的状态修改为离职。

将以上两个查询语句合并后,即可得到最终的解决方案。另外,如果想要定期执行此更新操作,可以将以上SQL语句封装成一个存储过程,并定期调用。

可以两张表做关联后做update的,这里有一篇不错的博客,供参考:https://www.cnblogs.com/b400800/p/16640320.html

1、需要考虑的问题:①、人员名下所有卡片均已失效(这里暂定状态为:OFF);②、有新人可能还未办理卡片,这部分人员不能被更新;③、只处理人员状态为”在职“的,更新为”离职“状态
大致SQL如下:(在MySQL5.7中使用类似表验证通过)

UPDATE USER u SET ca_state = '离职'
 WHERE state = '在职'
   AND EXISTS( SELECT 1 FROM card c
                WHERE u.userid = c.userid
                GROUP BY c.userid
               HAVING min( ca_state ) = max( ca_state ) AND min( ca_state ) = 'OFF' );

当然,如果该辅助人员状态字段(SQL中暂定的state)是新建的,里面没有任何值,则需要将UPDATE部分WHERE中的 “ state = '在职' AND ”部分去掉才行。

先两张表关联找到对应的离职人员,在替换掉

UPDATE 人员表
SET CA_State = 'off'
WHERE PE_Code IN (
  SELECT e.PE_Code FROM 人员表 e
  join 卡表 c 
  on c.PE_Code = e.PE_Code
  WHERE c.CA_State = '失效'
  )


表呢,存储过程方便的很

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

update 卡表 c ,人员表 p
set c.状态 = '离职'
where p.状态 ='离职' and p.id = c.人员id