こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

オラクルSQL 一致しないもの一覧

こんばんわ。ORACLEで、

A
平成 番号 種別 ...
21 12 1 ...
21 12 2 ...
22 13 3 ...
21 13 1 ...

B
平成 番号 種別
21 12 1 ...
21 12 5 ...
22 13 5 ...

というテーブルがあります。
ここから、平成は21(例えば)という条件で、Aにはあって、Bにはない。もしくは、BにはあってAにはないレコードを検索したいです。

結果は、下記となります。
平成 番号 種別 テーブル名
21 12 2 TABLE A
21 13 1 TABLE A
21 13 5 TABLE B

色々考えたのですがよい方法がわかりませんでした。
効率のよいSQLはありますでしょうか? レコードはA,Bそれぞれ数万件です。
よろしくお願いします。

投稿日時 - 2009-08-10 21:26:02

QNo.5197258

すぐに回答ほしいです

質問者が選んだベストアンサー

ORACLEなら、MINUSとUNIONの併用でしょうか・・・
MINUS=差集合を求める

(SELECT 平成,番号,種別,'TABLE A' FROM A
MINUS
SELECT 平成,番号,種別,'TABLE A' FROM B)
UNION
(SELECT 平成,番号,種別,'TABLE B' FROM B
MINUS
SELECT 平成,番号,種別,'TABLE B' FROM A)

このSQLが、ORACLEなら通るはず。(手元にないので未確認)

INTERSECTで積集合が取れるので、
和集合(UNION) -(MINUS) 積集合(INTERSECT)
という方法もありですね。

効率面で言えば、EXISTSよりは速かったはずです。

投稿日時 - 2009-08-11 17:21:07

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

with x as(
select a.*,'TABLE A' as tab from a
union all
select b.*,'TABLE B' from b
)
select x.heisei,x.bangou,x.syubetu
from x
where x.heisei = 21
group by x.heisei,x.bangou,x.syubetu
having count(*) = 1
;

投稿日時 - 2009-08-11 23:36:43

ANo.3

with x as(
select a.*,'TABLE A' as tab from a
union all
select b.*,'TABLE B' from b
),y as(
select x.*,count(*)over(partition by heisei,bangou,syurui) as cnt from x
)
select heisei,bangou,syurui,tab from y where cnt = 1 and heisei = 21

投稿日時 - 2009-08-11 22:42:29

ANo.1

「[平成]カラムが21で、全カラムが同じ値のレコードが他のテーブルに無いレコードを検索する」ということでしょうか?
そうだとすると、下記の様になると思うのですが・・・。(最後の行の番号が12)
-----------------------------------
平成 番号 種別 テーブル名
21 12 2 TABLE A
21 13 1 TABLE A
21 12 5 TABLE B
-----------------------------------

上記のような条件だとすると、EXISTS句とUNIONを使えばできると思います。

例) ---------------------------------------------------------------
SELECT
*, 'TABLE A' AS テーブル名
FROM A
WHERE
heisei = 21 AND
NOT EXISTS (
SELECT 'X' FROM B
WHERE A.heisei = B.heisei AND A.num = B.num AND A.kind = B.kind
)
UNION
SELECT
*, 'TABLE B' AS テーブル名
FROM B
WHERE
heisei = 21 AND
NOT EXISTS (
SELECT 'X' FROM A
WHERE A.heisei = B.heisei AND A.num = B.num AND A.kind = B.kind
)
;
-------------------------------------------------------------------
なお、手元にOracleは無いので試してはいません。

投稿日時 - 2009-08-11 01:08:46

あなたにオススメの質問