微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅当其所有记录在特定列中都为空时才查询返回true

如何解决仅当其所有记录在特定列中都为空时才查询返回true

让我们假设有一个 assignments ,其列为

  • assignment_id
  • 分配人
  • task_id
  • 受让人

相同的task_id可以由分配者分配给1个以上的受让人。 目前,我有一个分配给2名女传教员的任务。让我们在下表中查看我的示例:

+---------------+----------+---------+----------+
| assignment_id | assignor | task_id | assignee | 
+---------------+--------------------+----------+
|       1       |    a1    |    t1   |    x1    | 
+---------------+----------+---------+----------+
|       2       |    a1    |    t1   |    x2    | 
+---------------+----------+---------+----------+

转让人删除受让人后,该表如下所示:

+---------------+----------+---------+----------+
| assignment_id | assignor | task_id | assignee | 
+---------------+--------------------+----------+
|       1       |    a1    |    t1   |    x1    | 
+---------------+----------+---------+----------+
|       2       |    a1    |    t1   |   null   | 
+---------------+----------+---------+----------+

现在,我需要一个仅当此特定task_id的每个记录在受让人列中都为空值时才返回true的查询。 我到目前为止所写的内容

SELECT disTINCT task_id,nulls,total,(CASE
        WHEN nulls = total then true
        ELSE false
    END) unassigned
    
FROM

(
SELECT task_id,(SELECT count(*) FROM assignments b WHERE assignee IS NULL AND b.task_id = a.task_id) 'nulls',(SELECT count(*) FROM assignments b WHERE b.task_id = a.task_id) 'total'

FROM assignments a 

WHERE assignee is NULL) c

结果是:

+--------------------------------------+
| task_id | nulls | total | unassigned | 
+--------------------------------------+
|    1    |   2   |   2   |     1      | 
+---------+-------+-------+------------+

关于改善查询或完全取代查询的任何建议吗?

解决方法

如果我正确地遵循了您的规定,则可以使用聚合:

select assignment_id,count(*) - count(assignee) as nulls,count(*) as total,case when count(assignee) = 0 then 1 else 0 end as unassigned
from assignments
group by assignment_id

如果您要过滤未分配的分配,则可以在查询的末尾添加having子句:

having count(assignee) = 0
,

我认为您只需要两列:task_idnull中带有assignee的行数。
因此,group by taskid并在having子句中设置条件:

select task_id,count(*) total
from assignments
group by task_id
having max(assignee) is null

条件having max(assignee) is null仅返回taskid列中只有null个的assignee个。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。