我对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在的MISC_ID(在ENABLED = 0的RULE_IDs中)。在上面的示例中,查询应该返回MISC_ID = {1},因为HOLD_ID 1、2和3都具有READY = 1,并且RULE 1、2和3也都被禁用了。
由于HOLD_ID 4的READY = 0,因此不应返回MISC_ID 2。
表MISC和HOLD具有数百万行,但是RULE很小(<1000行)。
关于如何编写本机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 );