重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

こんばんわ。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それぞれ数万件です。
よろしくお願いします。

A 回答 (4件)

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よりは速かったはずです。
    • good
    • 0

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
;
    • good
    • 0

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
    • good
    • 0

「[平成]カラムが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は無いので試してはいません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!