我有两个表(请求和requests_details)等如下所示。申请表已REQUEST_ID和请求名称和requests_details有细节的请求是否是未决,批准或拒绝。我已经实现在一个下面两个表使用Spring JPA许多映射。在requests_details表,如果有第二个条目除了在待处理的请求的状态,然后从该请求是否被批准,我们可以知道状态或拒绝一个手段
现在我有一个要求,分别得到所有未决和批准请求
我已经写的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"
但对于上面的查询它不返回任何请求
任何人都可以请帮我在这
什么在第一个查询的情况是,就表示该状态应为“待定”,而不是“已核准”(这包括“拒绝”)或不是“拒绝”(这包括所有其他情况下),这就是为什么你会得到一切。
如果你试图让所有“待定”则只是简单的
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
会发生什么事是你找到所有“待定”的请求,然后确保这些也为“已核准”。这与子查询完成。在那里,你只需要知道,用正确的ID的记录,并为“批准”的状态存在,这就是为什么你会使用计数,你已经从以前的部分有数据。
注意:这将是从更新请求的状态是个好主意“待定”到“已批准”或“拒绝”,而不是插入新记录。这将是更安全,查询会更简单,更快(你不需要的子查询)。这也将避免在请求最终有多个相互冲突的状态可能的错误。