2

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 を選択するにはどうすればよいですか?

4

5 に答える 5

5

最も簡単なオプションは、一般的に次のようなものです

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を削除できます。distinctHAVING

于 2012-07-27T04:49:02.620 に答える
2

これを試して:

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)
于 2012-07-27T03:47:29.087 に答える
1

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

于 2012-07-27T04:33:27.880 に答える
1

このオプションを使用すると、アプリケーションが必要な列を選択するまで、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 (
  ...
)
于 2012-07-27T04:37:28.543 に答える
1

ここにオプションがあります... 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
  )
于 2012-07-27T03:52:44.370 に答える