• 締切済み

副問い合わせのSQLでデータの組み合わせを確認

ColAには'01'、'02'、'03'のレコードが二件ずつ存在します。 表1は、ColAとColBの組み合わせが合っていますが、 表2は、ColAが'03'のレコードのColBには、'B'が無く'C'が存在します。 以下のようにColAとColBの組み合わせが合っている事が分かるSQLを 組みたいです。 どのようなSQLを組めば良いか教えて頂きたいです。 一応、副問い合わせを使えばどうにかなるのかと思っていますが、 具体的にどう組めばよいのかが分かりません。 どなたか分かる方、教えて下さい。 環境:Oracle10g 表1(正常) ColA ColB 01 A 01 B 02 A 02 B 03 A 03 B 表2(エラー) ColA ColB 01 A 01 B 02 A 02 B 03 A 03 C

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

先ず、問題を整理してみることから始めましょう。 文面からすると、以下のように考えられますが、如何でしょうか? (1)ColA:ColBは1:nである。 (2)全てのColAの値に対し、nは同じ。 (3)ColBの取り得る値は本来は全て同じ。 次に「組み合わせが合っている事が分かる」と言う意味が曖昧です。 相手が人間だと、上手く解釈してくれるのですが、機械だとそうは いきません。「正しい組合せのものを抽出する。」とか、「不正な 組合せのものを抽出する。」とかいう表現でないと、実現できません。 それと、基準(模範解答)がどれなのかも明確ではないようです。 A、Bが正しいのか、A、Cが正しいのか、はたまたX、Yが正しいのか・・・ そこで、以下の仮定を立てます。 (1)ColA='01'の組合せが基準 (2)上記のものと一致しない(不正な)データを抽出する。 以下は上記仮定の一例です。 SELECT A.* FROM 表1 A WHERE A.ColB Not In (SELECT ColB FROM 表1 WHERE ColA='01')

t_kchj
質問者

お礼

解決しました。 ありがとうございました。 >(1)ColA:ColBは1:nである。 >(2)全てのColAの値に対し、nは同じ。 >(3)ColBの取り得る値は本来は全て同じ。 はい。その通りです。 >(1)ColA='01'の組合せが基準 ColA='02'とColA='03'も組合せもチェックしないといけないので、 教えて頂いたSQLを参考にして解決できました。 >(2)上記のものと一致しない(不正な)データを抽出する。 はい。その通りです。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

そういう意味ですか。 それぞれでColA単位にColBにAとBが1つずつあるかどうか、ということですね。 SELECT ColA FROM 表 GROUP BY ColA HAVING SUM(CASE WHEN ColB='A' THEN 1 ELSE 0 END)<>1 OR SUM(CASE WHEN ColB='B' THEN 1 ELSE 0 END)<>1

t_kchj
質問者

お礼

度々、ありがとうございます。 ちょっと例題が悪くてあまり伝わってないような気がします。 ごめんなさい。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

>ColAとColBの組み合わせが合っている事が分かるSQL という表現が漠然としているので、どういうデータを戻したいかによってさらにバリエーションが分かれるのですが、 「表2で組み合わせの合っていないものを表示する(全部合っていれば結果は0行)」というものだと仮定すれば以下の通りです。 ・SELECT ColA,ColB FROM 表2 MINUS SELECT ColA,ColB FROM 表1 ・SELECT ColA,ColB FROM 表2 t2 WHERE NOT EXISTS (SELECT NULL FROM 表1 t1 WHERE t1.ColA=t2.ColA AND t1.ColB=t2.ColB) ・SELECT ColA,ColB FROM 表2 WHERE (ColA,ColB) NOT IN (SELECT ColA,ColB FROM 表1) ・SELECT t2.ColA,t2.ColB FROM 表2 t2 LEFT OUTER JOIN 表1 t1 ON t1.ColA=t2.ColA AND t1.ColB=t2.ColB) WHERE t1.ColA IS NULL

t_kchj
質問者

お礼

早速、解答ありがとうございます。 申し訳ないですが、表1、表2を記述しているのは 2つの表があるという意味ではなくて表は1つで 表1の場合は、0件。 表2の場合は、1件という事を確認したいのです。 失礼します。

関連するQ&A