2015-08-14 100 views
0

我想找到所有的桶至少有一个交易被拒绝,但不是全部。理想情况下,我希望在单个查询中使用key = bucket_id和value = ids的Map。JPQL与

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条款中?

回答

1
  • 首先必须删除t.id,否则distinct难道不工作
  • 二使用T2在内部选择这样你可以比较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另一个与您正在查看的状态不同的transac。

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) 
+0

可以有2个以上的状态,谢谢你的回答! – mfudi