java - SQL仅在所有行都满足条件时才选择行

标签 java 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 位于(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/

相关文章:

java - LinearLayout onShow 它将 ScrollView 向下移动

Java 的 Calendar.DAY_OF_WEEK 返回不正确的值

java - 从构造方法调用方法 - Java

java - Apache ActiveMQ 中的内存泄漏

sql - 表左外连接自身 : How does this work?

sql - T-Sql 查询 - 获取跨 2 列的唯一行

java - 没有提取任何数据。为什么?

java - 定时器调度方法超过时间

sql - 计算连续天数

SQL 图效率