• 締切済み

OracleSQL 組み合わせチェック

いつもお世話になっております。 OracleSQL 組み合わせチェックについて、 どのようにしたらチェックができるのかお知恵をお貸しください。 ◆データテーブル 連番 データ ------------- 1    01 1    10 2    02 2    20 3    10 3    01 4    03 4    30 5    01 5    20 <やりたいこと> 連番は必ず2組みずつ入っていて、 データの組み合わせが(01,10)(02,20)(03,30)のどれかになっています。 ※組み合わせなので、(10,01)等の場合もあります。 正しくない組み合わせを抽出したいです。 結果としては、下記の出したいです。 連番 データ ------------- 5    01 5    20 どのようにSQLを組めばこのようなチェックができるでしょうか? よろしくお願いします。

  • Oracle
  • 回答数4
  • ありがとう数0

みんなの回答

回答No.4

今更だけどスマートなの書いてみました。 Select T1.連番, T1.データ From データテーブル T1 Inner Join データテーブル T2 -- 自分と自分を結合する On T1.連番 = T2.連番 -- 連番が同じ And T1.RowId != T2.RowId -- 自分自身のレコードじゃない And T2.データ != Decode( T1.データ, 01, 10, 10, 01, 02, 20, 20, 02, 03, 30, 30, 03, Null ) -- データが組み合わせ通りじゃない Order By T1.連番, T1.データ;

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.3

select No,minData,maxData from (select "連番" No,min("データ") minData from "テーブル" group by "連番") tbl1, (select "連番" No,min("データ") maxData from "テーブル" group by "連番") tbl2 where tbl1.No = tbl2.No and (minData,maxData) not in (select 01,10 from dual union select 02,20 from dual union select 03,30 from dual ) order by No でいいと思うけど(未検証) 簡単に説明すると (select "連番" No,min("データ") minData from "テーブル" group by "連番") tbl1, で最小値、 (select "連番" No,min("データ") maxData from "テーブル" group by "連番") tbl2 で最大値を求める(必ず2つなので、最小値に小さいほう、最大値に大きいほうがはいる) "連番"で結合すると、 1,01,10 2,02,20 ・・・ 5,01,20 となり、 (minData,maxData) not in ・・・ の条件で No,minData,maxData ------------------ 5,01,20 とでてくる。 質問のように 連番 データ ------------- 5    01 5    20 と出したければ、 select No "連番",mindata "データ" from (上記select文でorder by句抜き) union select No "連番",maxdata "データ" from (上記select文でorder by句抜き) order by no とすればいいと思いますが、あえてそうする必要があるのかどうか?

回答No.2

select * from データテーブル a where not( データ='01' and exists(select 0 from データテーブル b where データ='10' and a.連番=b.連番) or データ='02' and exists(select 0 from データテーブル b where データ='20' and a.連番=b.連番) or データ='03' and exists(select 0 from データテーブル b where データ='30' and a.連番=b.連番) or データ='10' and exists(select 0 from データテーブル b where データ='01' and a.連番=b.連番) or データ='20' and exists(select 0 from データテーブル b where データ='02' and a.連番=b.連番) or データ='30' and exists(select 0 from データテーブル b where データ='03' and a.連番=b.連番)) です。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

与えられた条件をまとめると、 ・連番は数字(正確には質問の中で言及されていないがとりあえずこうしておく)。 ・データはvarchar2(2)またはnvarchar2(2)であり、必ず2文字入っている。 ・1つの連番につきデータは必ず2件のみであり、1件または3件以上ある場合はない。 ・1つの連番につきデータはX0と0Yのみで、XXやXYなど(例えば11)はない。 という前提で、 select * from データテーブル where データ like '%0' とすると連番と10、20、30のデータのものが抽出され、 select * from データテーブル where データ like '0%' とすると連番と01、02、03のデータのものが抽出される。 そこでその2つのselect結果をインラインビュー(サブクエリー)としてinner joinで「正しくない」条件で結合してやればよい。 select d1.連番, d1.データ, d2.データ from (select * from データテーブル where データ like '%0') d1 inner join (select * from データテーブル where データ like '0%') d2 on ? order by d1.連番 asc この?の部分を考えていただきたい。 ヒント:同じ連番の中でd1のデータの1文字目とd2のデータの2文字目が・・・・? さらに > 結果としては、下記の出したいです。 には、 select * from データテーブル where 連番 in ( select d1.連番 from (select * from データテーブル where データ like '%0') d1 inner join (select * from データテーブル where データ like '0%') d2 on ? ) order by 連番 asc, データ asc とさらにサブクエリにする事で対応できそうだね。

関連するQ&A

  • SQLの書き方(チェックボックス)

    このスレでいいのかちょとわからなかったのですが、 SQLの書き方のなのでこちらで質問をさせて頂きます。 (VB.NET) □ A □ B □ C チェックボックス(A,B,C)があります。 例えば(A、B,C)どれか一つ選択された場合 SELECT文でテーブルA、B、Cからデータを抽出するイメージは わくのですが、チェックボックスで(A、C)など複数 選択された場合には、SELECT文でテーブルAを抽出し 終わった後、SELECT文でテーブルCを抽出するのは 問題があるのではないかと思います。 ただイメージがわきません…。ヒントでもいいので もしよろしければアドバイスよろしくお願い致します。

  • 指定した数字が含まれる組合せを抽出する。

    どなたかご存じでしたら回答をお願いします。 数字選択式宝くじの「ミニロト」の組合せをフリーソフトで作成&CSVデータに出力しています。 これをエクセルに取りこむと下記のようになります。 【作成されてエクセルに取りこんだCSVデータ】 01 04 06 07 22 01 06 07 13 22 01 06 07 22 27 03 04 11 13 29 04 13 15 18 27 ここから、「指定した数字の○ or ○ or ○ or ○ or ○が含まれる組合せを抽出する。」 というのをエクセルでやりたいですがどうやればよいでしょうか? できれば1回の操作で結果が出るのがよいです。 上記例でいうと、「指定した数字の4 or 13 が含まれる組合せを抽出する。」と指定すれば 下記抽出結果が得られる。 【抽出結果】 01 04 06 07 22 01 06 07 13 22 03 04 11 13 29 04 13 15 18 27 CSVデータは1個~169911個まであります。 指定された数字が第1数字~第5数字のいずれかに入っていれば抽出対象です。 指定する数字は1個~5個です。 エクセルの操作およびVBAでのソースを教えて下さい。 よろしくお願いします。

  • SQLでのデータチェック方法

    いつもお世話になっております。 SQLでのデータチェック方法について教えてください。 【売上テーブル】 日付、商品、代理店、金額 ---------------------- 5/1 消しゴム AA商店 100 5/1 鉛筆    BB商店 200 5/2 鉛筆    ZZ商店 200 5/2 万年筆  CC商店 150 【商品マスタテーブル】 品名 ----------- 消しゴム 鉛筆 【代理店マスタテーブル】 代理店 ----------- AA商店 BB商店 CC商店 この中で各種マスタに存在しないデータを抽出したいです。 select * from 売上テーブル where 商品 not in (select 品名 from 商品マスタ) or 代理店 not in (select 代理店 from 代理店マスタ) で抽出できるのはわかるのですが、 抽出結果に何故そのレコードが抽出されたのかをわかるようにしたいです。 日付、商品、代理店、金額  理由 ------------------------------- 5/2 鉛筆    ZZ商店 200 代理店マスタに存在しない 5/2 万年筆  CC商店 150 商品マスタに存在しない このような感じで理由も追加することは可能でしょうか? わがままですみません。 よろしくお願いします。

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから みかん=3(行目) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 101   りんご 100 102   りんご 100 103   みかん 150 104   りんご 100 105   みかん 150 106   メロン 250 postgre8.3のためrow_numberが使えません

  • 連番に紐づく小連番の最大値を除外するには…

    お世話になります。 以下のテーブルから、次のアウトプットを行うためのSQLをご教授ください。 【インプット】 大連番 小連番 … 000001 000001 … 000001 000002 … 000001 000003 … 000001 000004 … 000002 000001 … 000002 000002 … 000002 000003 … 000003 000001 … 000003 000002 … 【アウトプット】 大連番 小連番 … 000001 000001 … 000001 000002 … 000001 000003 … 000002 000001 … 000002 000002 … 000003 000001 … ※大連番毎に小連番の最大値のデータを除いている。 どうか、お力添えをお願い致します。。。

  • 行数をカウントするSQLにつきまして

    行数をカウントするSQLにつきまして いつもお世話になっております。 下記の売上テーブルから りんご=3(行) みかん=2(行) メロン=1(行) というようなデータを抽出するSQLはどのように記述したら良いのでしょうか? ・・・・売上テーブル・・・ 売上番号 品名 単価 1     りんご 100 2     りんご 100 3     りんご 100 4     みかん 150 5     みかん 150 6     メロン 250

  • ある条件のSELECT文の作成について

    以下のSQLの作成で悩んでいます。 【内容】 抽出元テーブルの中で、あるコードが同じデータは、 ある項目を全て同じ値にして取得したい。 (例) ■抽出元テーブル コード SEQ FLG  1    1   1  1    2    1    3    2    1   0  2    2  2    3  3    1   1 コードは同じ物が1つ又は複数あります。 コードが同じ物にはSEQで番号が連番されます。 FLGの項目がありますが、SEQ=1のデータしか設定されていません。 ■求めたい結果 コード SEQ FLG  1    1   1  1    2   1    1    3   1  2    1   0  2    2   0  2    3   0  3    1   1 全てのデータでFLGを求めて取得します。 取得の仕方はコードが同じでSEQ=1の値を取ります。 抽出元テーブルと結果のデータ件数は同じになります。 抽出元テーブルと結果の違いは、FLGに値が埋まっているかどうかの違いのみです。 このテーブルのFLGはUPDATEする事は出来ません。 別表なども利用しないで、 selectのSQL文だけで対応したいです。 どのような方法で対応できるでしょうか? オラクルのバージョンは10gです。 よろしくお願い致します。

  • SQLの構文で質問です。

    いつもお世話になっております。 SQLの構文で質問です。 テーブルを開いて、データの中から日付を絞って抽出したいのですが、 whereの後にどのような記述をすればいいのかわかりません。 なんとなく『>』を使ってやってみましたがうまく抽出できませんでした。 例えば、2008/12/01~2008/12/31の絞りで抽出できるようにしたいのですが。 SELECT * FROM 日付 WHERE (日付   2008 / 12 / 01    2008 / 12 / 31) すみません、SQLを使い始めて間もなく本を見てはいるのですがうまくいかないもので。 宜しくお願いします。

  • これをSQLでやることは可能ですか?

    すいません。どうしても閃かないので教えてください。 まず、テーブルは 連番  PK コード 日付 となっています。 その中のデータは 連番  コード   日付 -----+--------+--------- 1   |   001 | 2002/01 2   |   001 | 2002/02 3   |   002 | 2002/03 4   |   002 | 2002/04 5   |   003 | 2002/05 -----+--------+--------- となっています。 このデータの中から 「コード毎に日付が一番新しい連番」を取得したいのですが可能でしょうか? 結果は 連番   コード   日付 -----+--------+--------- 2   |   001 | 2002/02 4   |   002 | 2002/04 5   |   003 | 2002/05 -----+--------+--------- となって欲しいのですが・・・ どなたかこれを実現するSQLを教えてください。 お願いします。

  • 絞込みする時のSQLの書き方

    お世話になります。 絞込みする時のSQLの書き方について教えてください。 具体的には テーブル名tbl01,フィールド名f01,f02とした場合 1.f01もしくはf02にAという文字を含むレコードを抽出。 SQL = "select * from tbl01 where f01 like '%A%' or f02 like '%A%'" 2.続いて、1で抽出したデータからf01もしくはf02にBという文字を含むレコードを抽出するSQL文 SQL = ????? あくまでも、1と2を満たす条件を1つのSQL文で表す方法です。一旦、1の結果をワークテーブルに落とし、そこから2だけのSQL文を実行するわけではありません。