假设我有这两张桌子
餐桌要求:
ID_请求 | 用户 |
---|---|
1 | 亚当 |
2 | 本 |
3 | 查理 |
表评论:
ID_REVIEW | ID_请求 | 评论 |
---|---|---|
1 | 1 | 已批准 |
2 | 1 | 已批准 |
3 | 1 | 拒绝 |
4 | 2 | 已批准 |
5 | 2 | 已批准 |
我想选择我的所有请求,加入到评论表中,这样,如果any DENIED 条目存在,则“评论”字段被拒绝;如果only APPROVED 存在,则“评论”字段被批准;如果没有评论,则为 NULL/第三个值完全没有。
我希望我的输出是:
ID_请求 | 用户 | 评论 |
---|---|---|
1 | 亚当 | 拒绝 |
2 | 本 | 已批准 |
3 | 查理 | NULL(或待处理) |
我想我想要一个 LEFT JOIN 来捕获根本不存在的评论。我正在尝试做类似 GROUP BY 的事情,尽管也许 CASE 更合适。我不认为 COALESCE 是我需要的,但我很高兴我错了!
这可以使用条件聚合来完成:
SELECT ID_REQUEST, USER, CASE WHEN COUNT_DENIED > 0 THEN 'DENIED'
WHEN COUNT_APPROVED = TOTAL_REVIEW AND TOTAL_REVIEW > 0 THEN 'APPROVED'
ELSE 'PENDING'
END AS REVIEW
FROM (
SELECT rq.ID_REQUEST, rq.USER,
COUNT(CASE WHEN REVIEW = 'DENIED' THEN 1 END) AS COUNT_DENIED,
COUNT(CASE WHEN REVIEW = 'APPROVED' THEN 1 END) AS COUNT_APPROVED,
COUNT(REVIEW) AS TOTAL_REVIEW
FROM REQUESTS rq
LEFT JOIN REVIEWS rv ON rq.ID_REQUEST = rv.ID_REQUEST
GROUP BY rq.ID_REQUEST, rq.USER
) AS s
结果:
ID_REQUEST USER REVIEW
1 Adam DENIED
2 Ben APPROVED
3 Charlie PENDING