我是 SQL 的新手,虽然我可以绕过编写大部分查询,但我对这个查询一无所知。我想在我可以使用 JPA 执行的单个查询中实现这一点。
TABLE RULE:
RULE_ID ENABLED
-----------------
1 0
2 0
3 0
4 1
5 1
TABLE MISC:
MISC_ID
--------
1
2
TABLE HOLD:
HOLD_ID MISC_ID RULE_ID READY
------------------------------------
1 1 1 1
2 1 2 1
3 1 3 1
4 2 4 0
5 2 1 1
我只想从 HOLD 中选择每行 READY=1 且 RULE_ID 位于(RULE_IDs where ENABLED=0)的 MISC_ID。在上面的示例中,查询应返回 MISC_ID = {1},因为 HOLD_ID 1、2 和 3 都具有 READY=1 并且 RULE 1、2 和 3 都被禁用。
不应返回 MISC_ID 2,因为 HOLD_ID 4 的 READY=0。
MISC 和 HOLD 表有数百万行,但 RULE 相当小(<1000 行)。
关于如何编写 native SQL 来实现此目的有什么建议吗? PL/SQL 不是一个选项。
最佳答案
SELECT MISC_ID
FROM HOLD
GROUP BY MISC_ID
HAVING MIN(READY) <> 0;
运行示例:
$ with HOLD (HOLD_ID, MISC_ID, RULE_ID, READY)
as (values
(1,1,1,1),
(2,1,2,1),
(3,1,3,1),
(4,2,4,0),
(5,2,1,1)
)
select MISC_ID
from HOLD
group by MISC_ID
having min(READY) <> 0;
misc_id
---------
1
(1 row)
修改查询以处理加入规则:
SELECT HOLD.*, RULE.*
FROM HOLD
INNER JOIN RULE
ON HOLD.RULE_ID = RULE.RULE_ID AND RULE.ENABLED = 0
WHERE MISC_ID IN (
SELECT MISC_ID
FROM HOLD
GROUP BY MISC_ID
HAVING MIN(READY) <> 0
);
关于java - SQL仅在所有行都满足条件时才选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13411885/