具有 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 BYHAVING 而是使用 WHERE
  • 现在,如果您需要 ID,则必须将此查询与另一个查询连接起来。你想要第一个 ID,最后一个 ID?

SQL FIDDLE DEMO

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)