簡體   English   中英

僅當所有行都符合條件時才選擇行的 SQL

[英]SQL to select rows only if all of them meet a criteria

我對 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 中選擇 MISC_IDs,其中每一行都有 READY=1 並且 RULE_ID 在(RULE_IDs where ENABLED=0)。 在上面的示例中,查詢應返回 MISC_ID = {1},因為 HOLD_ID 1、2 和 3 都具有 READY=1 並且規則 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
);

使用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

嘗試這個 ::

    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM