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_ID (ENABLED=0 の RULE_ID) のみを選択したいと考えています。上記の例では、HOLD_ID 1、2、および 3 はすべて READY=1 であり、RULE 1、2、および 3 はすべて無効になっているため、クエリは MISC_ID = {1} を返す必要があります。

HOLD_ID 4 は READY=0 であるため、MISC_ID 2 は返されません。

表 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

または、HAVINGMIN 値と 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 に答える