![](/img/trans.png)
[英]how can I navigate through an array, check all the elements between them and if they meet a criteria display them?
[英]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.