让我们假设有一个表 assignments ,其列为
相同的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 |
+---------+-------+-------+------------+
关于改善查询或完全取代查询的任何建议吗?
答案 0 :(得分:0)
如果我正确地遵循了您的规定,则可以使用聚合:
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
答案 1 :(得分:0)
我认为您只需要两列:task_id
和null
中带有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
个。