一尘不染

SQL仅在所有行均符合条件时选择行

sql

我对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。


阅读 187

收藏
2021-03-08

共1个答案

一尘不染

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
);
2021-03-08