如何处理返回没有行的 IN 子句的子查询

Posted

技术标签:

【中文标题】如何处理返回没有行的 IN 子句的子查询【英文标题】:How to handle subquery returning for IN clause having no rows 【发布时间】:2019-11-25 03:19:12 【问题描述】:

我有一个架构,其中分配了位置的员工详细信息保存在“员工”表中。

分配给位置的所有角色都具有 max_limit 计数,并且assigned_count 在 'loc_role_limit' 表中

分配给员工的所有角色都保存在“emp_role”表中

现在当一个员工被停用时,我想减少那个位置的assigned_count和那个员工的角色

UPDATE loc_role_limit lrl SET lrl.assigned_count = lrl.assigned_count + 1  
WHERE lrl.location = (select e.location from employee e where e.empCode = ?1)
    AND lrl.role IN  (select er.roleCode from empl_role er where er.empCode = ?1) 

但是,只有当没有角色分配给员工并且想要停用时,才会有一个问题

    AND lrl.role IN  (select er.roleCode from emp_role er where er.empCode = ?1) 

那么这个 IN 子句将给出空列表。

一种方法是我将执行另一个查询,如果大小大于 0,那么我将调用 UPDATE 查询。 但是,这将是来自应用程序的 2 个查询。

有什么方法可以从查询端处理这个问题?

【问题讨论】:

为什么要标记 mysql 和 SQL Server? 【参考方案1】:

你可以使用EXISTS查询喜欢

UPDATE loc_role_limit lrl SET lrl.assigned_count = lrl.assigned_count + 1  
WHERE lrl.location = (select e.location from employee e where e.empCode = ?1)
AND EXISTS  (select er.roleCode from empl_role er where er.empCode = ?1)

【讨论】:

以上是关于如何处理返回没有行的 IN 子句的子查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql 里面如何处理子查询返回多个查询结果的情况

在 Grafana 中,我们如何处理在图表/面板中返回 0 行的查询?

在使用IN子句的postgreSql查询中用作表达式的子查询返回的多行

SQL里的子查询

7_mysql查询之where子句

删除查询中包含大表的 IN 子句中的子查询性能