2015-08-14 53 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