1

テーブルごとに、同じ列の2つのテーブル、アイテムコードと数量があります。

TABLE A                    TABLE B
--------------             -------------
X    2                      X   1
Y    1                      S   2
Z    5                      Z   5

私が得ようとしている結果は次のようなものです。

Table C
---------------
X  2  1
Y  1  0
S  0  2

qty両方のテーブルで異なるアイテム(ゼロとして表示される必要があるヌルを含む)のみが必要 です。

注:私はOracle8を使用しているため、ANSI FULLOUTERJOINを使用できません。

4

5 に答える 5

12

編集、質問はANSI構文を使用しないOracle 8に固有であるため、以下が機能するはずです。

select col1, 
  nvl(a_col2, 0) as a_col2, 
  nvl(b_col2, 0) as b_col2
from 
( 
  select a.col1, a.col2 as a_col2, b.col2 as b_col2 
  from TableA a, TableB b
  where a.col1 = b.col1(+)
  union
  select b.col1, a.col2 as a_col2, b.col2 as b_col2 
  from TableA a, TableB b
  where a.col1(+) = b.col1 
)      
where a_col2 <> b_col2
  or (a_col2 is null or b_col2 is null)

SQL FiddlewithDemoを参照してください。これは戻ります:

| COL1 | A_COL2 | B_COL2 |
--------------------------
|    S |      0 |      2 |
|    X |      2 |      1 |
|    Y |      1 |      0 |

ANSI構文をサポートするバージョンのOracleを使用している場合は、次を使用できますFULL OUTER JOIN

select 
  coalesce(a.col1, b.col1) col1, 
  coalesce(a.col2, 0) a_col2, 
  coalesce(b.col2, 0) b_col2
from tablea a
full outer join tableb b
  on a.col1 = b.col1
where a.col2 <> b.col2
  or (a.col2 is null or b.col2 is null);

SQL FiddlewithDemoを参照してください

于 2013-03-27T11:24:05.417 に答える
4

8以降(おそらく以前のバージョン)で機能するはずのクエリの別の記述。

FULL JOIN結合に恐ろしい構文を使用していない(+)ため、アップグレードで非推奨になった場合でも機能するはずです。

テーブルにNullがまだ存在しないと仮定すると、次のいずれかCOALESCE()は必要ありません。NVL()

SELECT  a.col1, 
        a.col2 AS a_col2, 
        b.col2 AS b_col2
FROM    TableA a, TableB b
WHERE   a.col1 = b.col1
  AND ( a.col2 <> b.col2
     OR a.col2 IS NULL
     OR b.col2 IS NULL
      )

UNION ALL

SELECT  col1, col2, 0
FROM    TableA a
WHERE   NOT EXISTS
        ( SELECT  *
          FROM    TableB b
          WHERE   a.col1 = b.col1
        )

UNION ALL

SELECT  col1, 0, col2
FROM    TableB b
WHERE   NOT EXISTS
        ( SELECT  *
          FROM    TableA a 
          WHERE   a.col1 = b.col1
        ) ; 

SQL-Fiddleでのテスト

于 2013-03-27T14:56:59.883 に答える
2
select code, nvl(a.qty,0) a, nvl(b.qty,0) b
from tableA a full join tableB b using(code)
where decode(a.qty, b.qty, 0) is null

フィドル

于 2013-03-27T11:19:12.430 に答える
2

別のオプション:

select
  full_list.item_code,
  nvl(table_a.qty,0) table_a_qty,
  nvl(table_b.qty,0) table_b_qty
from
  (select item_code from table_a
   union
   select item_code from table_b) full_list,
  table_a,
  table_b
where
  full_list.item_code = table_a.item_code(+) and
  full_list.item_code = table_b.item_code(+)
于 2013-03-27T13:21:03.657 に答える
0

次のクエリは適切に機能するはずです。

SELECT * FROM (
  SELECT nvl(a.c1, b.c2), nvl(a.col1, 0) qty1, nvl(b.col2, 0) qty2 FROM a FULL OUTER JOIN b ON a.c1 = b.c2
) where qty1 != qty2;

http://sqlfiddle.com/#!4/d37ff/5/0

于 2013-03-27T11:24:23.147 に答える