Получение всех ожидающих запросов от одного до нескольких сопоставлений - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть две таблицы ( запросы и запросы_детали ), как показано ниже. запросы таблица имеет request_id и имя запроса, а request_details содержит информацию о том, находится ли запрос на рассмотрении, утвержден или отклонен.Я реализовал две нижеприведенные таблицы в сопоставлении один ко многим с использованием Spring JPA.В таблице reports_details , если есть вторая запись, кроме статуса PENDING для запроса, это означает, что из статуса мы можем узнать, одобрен запрос или отклонен

Теперь у меня есть требованиечтобы получить все ожидающие и подтверждающие запросы отдельно

Я написал hql-запрос, как показано ниже

Для получения всех ожидающих запросов

SELECT request.name, details.* 
FROM requests request JOIN request_details details ON request.request_id=details.request_id 
WHERE 
details.status = "PENDING" AND 
details.status !="APPROVED" OR details.status !="REJECTED"

, но для вышеупомянутогозапрос возвращает все запросы

Для получения всех утвержденных запросов

SELECT request.name, details.* 
FROM requests request JOIN request_details details ON request.request_id=details.request_id 
WHERE 
details.status = "PENDING" AND 
details.status ="APPROVED"

, но для вышеуказанного запроса он не возвращает никаких запросов

enter image description here

Мой ожидаемый результат, как указано ниже

enter image description here

enter image description here

Может кто-нибудь, пожалуйста, помогите мне в этом

1 Ответ

0 голосов
/ 06 февраля 2019

То, что происходит в первом запросе, заключается в том, что вы заявляете, что статус должен быть «ОЖИДАЕТ», а не «УТВЕРЖДЕН» (это означает «ОТКАЗАНО») или не «ОТКАЗАНО» (это охватывает вседругие случаи), вот почему вы получаете все.

Если вы пытаетесь получить все "ОЖИДАЕМЫЕ", тогда просто просто

SELECT
  request.id,
  details.*
FROM requests request
  JOIN request_details details ON request.request_id = details.request_id
WHERE details.status = "PENDING"
AND (SELECT count(*) FROM requests_details
     WHERE requests_details.request_id = request.request_id) = 1

Подзапрос гарантирует, что для запроса есть только одна записьэто означает, что это только «В ОЖИДАНИИ» и не было одобрено или отклонено.


Во втором случае вы ничего не получаете, потому что заявляете, что статус должен быть «В ОЖИДАНИИ» и «УТВЕРЖДАЕТСЯ» одновременно, и это всегда будет ложным.

Если вы хотите получить записи, которые являются одновременно «ОЖИДАЕМЫМИ» и «УТВЕРЖДЕННЫМИ», вы можете сделать что-то вроде этого

SELECT
  request.request_id,
  details.*
FROM requests request
  JOIN requests_details details ON request.request_id = details.request_id
WHERE details.status = 'PENDING'
  AND (SELECT count(*) FROM requests_details
         WHERE requests_details.request_id = request.request_id
           AND requests_details.status = 'APPROVED'
      ) = 1

В результате вы обнаружите все «ОЖИДАЕМЫЕ» запросы, а затем убедитесь, что они также «УТВЕРЖДЕНЫ».Это делается с помощью подзапроса.Там вам нужно только знать, что запись с правильным идентификатором и статусом «УТВЕРЖДЕНА» существует, поэтому вы должны использовать счетчик, данные, которые у вас уже есть из предыдущей части.


ПРИМЕЧАНИЕ: Было бы неплохо обновить состояние запросов с «ОЖИДАЕТ» на «УТВЕРЖДЕНО» или «ОТКАЗАНО», а не вставлять новую запись.Это будет безопаснее, а запросы будут более простыми и быстрыми (вам не понадобится подзапрос).Это также позволило бы избежать возможных ошибок, когда запросы имеют несколько конфликтующих состояний.

...