3

我对 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_IDs(RULE_IDs where ENABLED=0)。在上面的示例中,查询应该返回 MISC_ID = {1},因为 HOLD_ID 1、2 和 3 都具有 READY=1 并且 RULEs 1、2 和 3 都被禁用。

MISC_ID 2 不应返回,因为 HOLD_ID 4 的 READY=0。

MISC 和 HOLD 表有数百万行,但 RULE 相当小(<1000 行)。

关于如何编写本机 SQL 来实现这一点的任何建议?PL/SQL 不是一个选项。

4

3 回答 3

2
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
);
于 2012-11-16T07:03:56.227 回答
1

使用HAVING并匹配计数:

SELECT MISC_ID
FROM HOLD h
WHERE READY = 1
GROUP BY MISC_ID
HAVING COUNT(*) = (SELECT COUNT(*) FROM HOLD h2 WHERE h2.MISC_ID = h.MISC_ID)

或者,对自身使用反连接:

SELECT DISTINCT MISC_ID
FROM HOLD h
LEFT OUTER JOIN HOLD h2 ON h.MISC_ID = h2.MISC_ID AND h2.READY <> 1
WHERE h2.MISC_ID IS NULL

或者,使用HAVING并比较 MIN 和 MAX 值:

SELECT MISC_ID
FROM HOLD
GROUP BY MISC_ID
HAVING MIN(READY) = 1 AND MAX(READY) = 1
于 2012-11-16T07:02:43.953 回答
0

试试这个 ::

    Select * from TABLE_HOLD th

    group by MISC_ID

left join

(    Select MISC_ID from TABLE_HOLD

    group by MISC_ID having READY=0 ) temp_table on (th.MISC_ID=temp_table.MISC_ID)
where temp_table.HOLD_ID is null
于 2012-11-16T07:02:08.390 回答