Oracle DB に次のテーブルがあります。
ID VALUE
-----------
1 1
1 2
1 3
2 1
2 2
3 1
3 2
3 3
4 1
3 つの値 (1、2、3) を持つ ID を選択するにはどうすればよいですか?
最も簡単なオプションは、一般的に次のようなものです
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select 1 id, 1 val from dual union all
3 select 1 id, 2 val from dual union all
4 select 1 id, 3 val from dual union all
5 select 2 id, 1 val from dual union all
6 select 2 id, 2 val from dual union all
7 select 3 id, 1 val from dual union all
8 select 3 id, 2 val from dual union all
9 select 3 id, 3 val from dual union all
10 select 4 id, 1 val from dual
11 )
12 select id
13 from x
14 where val in (1,2,3)
15 group by id
16* having count(distinct val) = 3
SQL> /
ID
----------
1
3
このWHERE
句は、関心のある値を識別します。このHAVING
句は、それらの値がいくつ存在する必要があるかを示します。たとえば、3 つの値のうち少なくとも 2 つを含むすべての行が必要な場合は、HAVING
句を変更して 2 の値を検索しますCOUNT
。
特定のval
が ごとに最大 1 回発生することが保証されている場合は、句内のid
を削除できます。distinct
HAVING
これを試して:
SELECT ID
FROM TABLENAME T
WHERE EXISTS (SELECT *
FROM TABLENAME T1
WHERE T1.ID = T.ID AND T1.VALUE = '1')
AND EXISTS (SELECT *
FROM TABLENAME T2
WHERE T1.ID = T.ID AND T2.VALUE = '2')
AND EXISTS (SELECT *
FROM TABLENAME T3
WHERE T1.ID = T.ID AND T2.VALUE = '3')
また
SELECT ID
FROM TABLENAME T
WHERE (SELECT COUNT( * )
FROM (SELECT VALUE
FROM TABLENAME T1
WHERE T1.ID = T.ID
GROUP BY VALUE)) = 3;
ここで、3 は、a で計算できる値の数です。
SELECT COUNT( * )
FROM TABLENAME T1
GROUP BY VALUE
したがって、これは汎用になります。
SELECT ID
FROM TABLENAME T
WHERE (SELECT COUNT( * )
FROM (SELECT VALUE
FROM TABLENAME T1
WHERE T1.ID = T.ID
GROUP BY VALUE)) = (SELECT COUNT( * )
FROM TABLENAME T2
GROUP BY VALUE)
select id from (select id,sum(case when value=1 then 1 else 0 end) as 'v1',
sum(case when value=2 then 1 else 0 end) as 'v2',
sum(case when value=3 then 1 else 0 end) as 'v3'
from orac group by id) as final
where v1>0 and v2>0 and v3>0
このオプションを使用すると、アプリケーションが必要な列を選択するまで、ID 以外のものを取得できます。
SELECT ID,
sum(CASE WHEN VALUE = 1 THEN 1 ELSE 0 END) AS ONE,
sum(CASE WHEN VALUE = 2 THEN 1 ELSE 0 END) AS TWO,
sum(CASE WHEN VALUE = 3 THEN 1 ELSE 0 END) AS THREE
FROM MYTABLE
GROUP BY ID
HAVING ONE >= 1 AND TWO >= 1 AND THREE >= 1;
または、ケースが特定の場合 (値 1、2、3 のみが可能であり、重複する値は許可されません)、次のいずれかを試すことができます。
SELECT ID,
count(VALUE) AS VALUECOUNT
FROM MYTABLE
GROUP BY ID
HAVING VALUECOUNT = 3;
後で追加の値を追加する場合、副作用が発生する可能性があるため、そのようにする前に注意してください。ただし、現在のケースが上記の制限に適合する場合は、提案する価値があります。
もちろん、これらの中間カウントを取得するという考えが気に入らない場合は、別の select 内に指定したクエリを囲みます。
SELECT ID FROM (
...
)
ここにオプションがあります... HAVING 句の各式は、1、2、または 3 に等しい値の数をカウントしています。これらのカウントのいずれかが 1 未満の場合、ID は返されません。
http://sqlfiddle.com/#!4/00fdc/8
SELECT ID
FROM myTable
GROUP BY ID
HAVING
SUM(DECODE(VALUE, 1, 1, 0)) > 0 AND
SUM(DECODE(VALUE, 2, 1, 0)) > 0 AND
SUM(DECODE(VALUE, 3, 1, 0)) > 0
編集- 値 1、および 2 または 3 を要求するには:
SELECT ID
FROM myTable
GROUP BY ID
HAVING
SUM(DECODE(VALUE, 1, 1, 0)) > 0 AND
(
SUM(DECODE(VALUE, 2, 1, 0)) > 0 OR
SUM(DECODE(VALUE, 3, 1, 0)) > 0
)