2015-08-14 2 views
0

Я хочу найти все ведра, где хотя бы одна транзакция ОТКАЗАНА, но не все. В идеале мне хотелось бы получить карту с ключом = bucket_id и value = ids в одном запросе.JPQL having with существует

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 BY или HAVING использовать 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) 

EDIT

Если состояние только 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) 
+0

Может быть более двух статусов, спасибо вам за ответ! – mfudi

Смежные вопросы