長年COBOLをやっていまして、
どうしても考え方がCOBOL的になります。
テーブルAとテーブルBがありまして、
これをCOBOLでのようなマッチング処理を行い、
マスターAのみ、マスターBのみというデータを
拾い出したいのですが、SQLでできますでしょうか?
答え:
どういうマッチングでしょうか?
例えば表Aと表Bに両方あるデータを見つけたいといった場合、例えば
EXISTSという述語を使います。
select c1
from A
where exists(select * from B
where A.c1=c1)
EXISTS述語は、INで書き換えることが可能です。
select c1
from A
where c1 in(select c1 from B)
表Aにはあり、表Bにはないデータを見つけたいといった場合、例えば
NOT EXISTSを使います。
select c1
from A
where not exists(select * from B
where A.c1=c1)
NOT EXISTSは、NOT INで書き換えることが可能です。
select c1
from A
where c1 not in(select c1 from B)
表Aのデータと表Bのデータを対応付けて、新しい表Cを作りたいといった
ケースでは、ジョインを使うのが一般的でしょう。
ジョインにもいくつか種類があります。
代表的なものとしては・・・
INNER JOIN・・・両方の表に存在するデータのみ結合
OUTER JOIN・・・片方に対応するデータがない場合でも結合し、対応データがない部分はnullを返す
があります。
記述例としては、
select A.c1,B.c2,B.c3
from A inner join B
on A.c1=B.c1
といった感じです。
表Aと表Bのデータをマージして、表Aと同じレコード形式の結果を得たいと
行った場合には、UNIONといった機能もあります。
select c1,c2 from A 〜
union [all]
select c1,c2 from B 〜
といった記述になります。
union all指定だと重複データもそのままであり、allを省略すると、重複
排除された結果が返されます。
補足の質問:
長文のご説明ありがとうございます。この質問・回答は役に立ちましたか?
答え:
Aのみのデータを取得する場合、Bを外部結合し、Bの項目がNullのものという条件をつければいいです。
そうか、Not Exists (あれ?綴りが違うかも?)とか。(遅くなるからやらないでといわれて、使ったことないですが)
ウェブサイトのユーザーによる情報ポスト、JPQA.comのない保証の正しさ.