具有 with 的 JPQL 存在
JPQL having with exists
我想找到至少有一个事务被拒绝但不是全部被拒绝的所有存储桶。理想情况下,我希望在单个查询中得到一个带有 key=bucket_id 和 value=ids 的 Map。
id | bucket_id | status
1 | 1 | 'AVAILABLE'
2 | 1 | 'AVAILABLE'
3 | 1 | 'REJECTED'
4 | 2 | 'REJECTED'
5 | 2 | 'REJECTED'
6 | 2 | 'REJECTED'
我当前不工作的查询:
SELECT distinct t.bucket_id, t.id
FROM Transaction t
GROUP BY t.bucket_id, t.id
HAVING
EXISTS (select t.id FROM t WHERE t.status=REJECTED)
AND
EXISTS (select t.id FROM t WHERE t.status<>REJECTED)
作为这个查询的结果,我得到了桶 1 和桶 2。
如何在 HAVING 子句中表达条件:"at least one rejected but not all "?
- 首先必须删除t.id,否则
distinct
将无法工作
- 第二次在内部使用 T2 select 所以你可以比较 bucket_id.
- 而且您不需要
GROUP BY
或 HAVING
而是使用 WHERE
- 现在,如果您需要 ID,则必须将此查询与另一个查询连接起来。你想要第一个 ID,最后一个 ID?
SELECT distinct t.bucket_id
FROM transac t
WHERE
EXISTS (SELECT T2.id
FROM transac T2
WHERE
T2.status='REJECTED'
AND T2.bucket_id = t.bucket_id)
AND EXISTS (SELECT T2.id
FROM transac T2
WHERE
T2.status<>'REJECTED'
AND T2.bucket_id = t.bucket_id)
编辑
如果状态只有 2 个可能的值,这是另一种更简单的解决方案。意思是 Exists
另一个与您正在查找的交易状态不同的交易。
SELECT distinct t.bucket_id
FROM transac t
WHERE
EXISTS (SELECT T2.id
FROM transac T2
WHERE
T2.status <> t.status
AND T2.bucket_id = t.bucket_id)
我想找到至少有一个事务被拒绝但不是全部被拒绝的所有存储桶。理想情况下,我希望在单个查询中得到一个带有 key=bucket_id 和 value=ids 的 Map。
id | bucket_id | status
1 | 1 | 'AVAILABLE'
2 | 1 | 'AVAILABLE'
3 | 1 | 'REJECTED'
4 | 2 | 'REJECTED'
5 | 2 | 'REJECTED'
6 | 2 | 'REJECTED'
我当前不工作的查询:
SELECT distinct t.bucket_id, t.id
FROM Transaction t
GROUP BY t.bucket_id, t.id
HAVING
EXISTS (select t.id FROM t WHERE t.status=REJECTED)
AND
EXISTS (select t.id FROM t WHERE t.status<>REJECTED)
作为这个查询的结果,我得到了桶 1 和桶 2。
如何在 HAVING 子句中表达条件:"at least one rejected but not all "?
- 首先必须删除t.id,否则
distinct
将无法工作 - 第二次在内部使用 T2 select 所以你可以比较 bucket_id.
- 而且您不需要
GROUP BY
或HAVING
而是使用WHERE
- 现在,如果您需要 ID,则必须将此查询与另一个查询连接起来。你想要第一个 ID,最后一个 ID?
SELECT distinct t.bucket_id
FROM transac t
WHERE
EXISTS (SELECT T2.id
FROM transac T2
WHERE
T2.status='REJECTED'
AND T2.bucket_id = t.bucket_id)
AND EXISTS (SELECT T2.id
FROM transac T2
WHERE
T2.status<>'REJECTED'
AND T2.bucket_id = t.bucket_id)
编辑
如果状态只有 2 个可能的值,这是另一种更简单的解决方案。意思是 Exists
另一个与您正在查找的交易状态不同的交易。
SELECT distinct t.bucket_id
FROM transac t
WHERE
EXISTS (SELECT T2.id
FROM transac T2
WHERE
T2.status <> t.status
AND T2.bucket_id = t.bucket_id)