1

基本的に次のようなクエリを実行します。

select a, b, c
from tab
where tab.state = 'A'
minus
select a, b, c
from tab
where tab.state = 'B'

この例でaは、、、bおよびcがこのテーブルのキーフィールドです。stateもキーの一部であり、状態Bではなく状態Aにレコードがある状況を見つけようとしています。レポートしたい別のフィールド(キーにはない)がありますvalue、、これは、異なる州の同じレコードでは異なる場合があります。例:

abc状態値
---------------------
1 1 1 A 12
1 2 2 A 1002
1 3 9 A 43
1 1 1 B 17.34
1 2 2 B 1002

この場合、1,3,9状態がAであるキーを持つ行に関心があります。列の値も取得したいのですが、value試してみると次のようになります。

select a, b, c, value
from tab
where tab.state = 'A'
minus
select a, b, c, value
from tab
where tab.state = 'B'

返されるのは2行です。

abc値
--------------------------------
1 1 1 12
1 3 9 43

value基本的に、結果セットに入れたいのですが、には参加しませんminus。ここで明らかな何かが欠けているような気がしますが、たぶん私は疲れすぎてそれを手に入れることができません...;)

4

3 に答える 3

3

これを行うための明白な方法は次のようなものです。

select a, b, c, value
from tab
where tab.state = 'A' and not exists (
  select 1                          -- let the optimizer do its thing
  from tab ti
  where tab.state = 'B' and ti.a=tab.a and ti.b=tab.b and ti.c=tab.c)

distinctデータにdoubleを含めることができる場合は、外部クエリにを追加することもできます。

于 2011-05-05T19:56:14.540 に答える
1

state = 'A'一致する行ですべての行を結合できますstate = 'B'...

SELECT t1.a, t1.b, t1.c, t1.value, t2.value v2
FROM (SELECT a, b, c, value FROM tab WHERE state = 'A') t1
     LEFT JOIN (SELECT a, b, c, value FROM tab WHERE state = 'B') t2
            ON t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c

...次に、一致するものがなかった行を選択します。

 SELECT a, b, c, value
 FROM ( /* previous query */ )
 WHERE v2 IS NULL
于 2011-05-05T19:58:54.967 に答える
0
SELECT a,
  b,
  c,
  value
FROM tab tab1
INNER JOIN
  (SELECT a, b, c FROM tab WHERE tab.state = 'A'
  MINUS
  SELECT a, b, c FROM tab WHERE tab.state = 'B'
  ) tab2
ON tab1.a  = tab2.a
AND tab1.b = tab2.b
AND tab1.c = tab2.c 

上記のコードでうまくいくと思います。

于 2013-11-30T20:13:33.967 に答える