• 締切済み

SQLについて

SQLについてわからないのでご教授ください。 TABLE AAA コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 bbb 20100601 99999999 ccc 20100101 20110711 ccc 20110712 99999999 TABLE BBB コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 ccc 20100101 20110711 ・テーブルBBBの適用終了日が'99999999'のコードは テーブルAAAでは適用終了日が'99999999'の1レコードのみ。 ・テーブルBBBの適用終了日が'20100531'などの'99999999'以外は テーブルAAAでは適用終了日が'20100531'のレコードと、翌日'20100601'が適用開始日に設定され '99999999'が適用終了日に設定されたレコードの2レコードが存在。 上記2つが正常の状態です。 これらの条件に反する異常を検知するようなSQLを作りたいです。 たとえば、テーブルAAAのレコード[bbb 20100601 99999999]がない場合、 実行結果としてコード「bbb」が出力されるようなSQLが欲しいです。 異常がなければ、「なにも選択されませんでした。」でよいです。 条件として、 ・テーブルAAAでは「コード」「適用開始日」がPK ・テーブルAAAでは同じコードの「適用開始日」「適用終了日」の期間がかぶることはない ・テーブルAAAでは同じコードで3レコード以上は存在しない   (たとえば20100101~20100531、20100601~20100931、20101001~20101231の3つの期間は存在しない) 実行結果はあくまで私の考えで、 異常を検知できればどのような形でも大丈夫です。 なにかあれば補足します。 どうぞよろしくお願い致します。

  • Oracle
  • 回答数3
  • ありがとう数2

みんなの回答

  • dda167
  • ベストアンサー率76% (55/72)
回答No.3

ちょっと違いますね。訂正版です。 WITH CCC AS ( SELECT コード, TO_CHAR(TO_DATE(適用終了日, 'YYYYMMDD') + 1, 'YYYYMMDD') AS 適用開始日, '99999999' AS 適用終了日 FROM BBB WHERE 適用終了日 <> '99999999' ) SELECT DISTINCT コード FROM (( SELECT コード, 適用開始日, 適用終了日 FROM AAA MINUS SELECT コード, 適用開始日, 適用終了日 FROM BBB MINUS SELECT コード, 適用開始日, 適用終了日 FROM CCC ) UNION ALL ( SELECT コード, 適用開始日, 適用終了日 FROM BBB UNION ALL SELECT コード, 適用開始日, 適用終了日 FROM CCC MINUS SELECT コード, 適用開始日, 適用終了日 FROM AAA )) /

ullr88
質問者

お礼

お返事が遅くなり申し訳ありません。 ご回答ありがとうござます! これを参考に考えさせていただきます。

  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

こんな感じですか SELECT コード, 適用開始日, 適用終了日 FROM AAA MINUS SELECT コード, 適用開始日, 適用終了日 FROM BBB MINUS SELECT コード, TO_CHAR(TO_DATE(適用終了日, 'YYYYMMDD') + 1, 'YYYYMMDD'), '99999999' FROM BBB WHERE 適用終了日 <> '99999999' /

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

たとえば、 /* BBBの適用終了日が'99999999'の異常データ取得 */ select BBB.コード from BBB where BBB.適用終了日 = '99999999' and exists ( --AAAに'99999999'以外のレコードがあるか select * from AAA where AAA.コード = BBB.コード and AAA.適用終了日 != '99999999') union all /* BBBの適用終了日が'99999999'以外の異常データ取得 */ select BBB.コード from BBB where BBB.適用終了日 != '99999999' and not ( exists ( --AAAの適用終了日がBBBの適用終了日と同一レコードがあるか select * from AAA where AAA.コード = BBB.コード and AAA.適用終了日 = BBB.適用終了日) and exists ( --AAAの適用開始日がBBBの適用終了日+1日かつ適用終了日が'99999999'のレコードがあるか select * from AAA where AAA.適用開始日 = to_char(to_date(BBB.適用終了日,'yyyymmdd')+1,'yyyymmdd') and AAA.適用終了日 = '99999999')); とかでどうでしょうか。

ullr88
質問者

お礼

お返事が遅くなり申し訳ありません。 ご回答ありがとうござます! これを参考に考えさせていただきます。

関連するQ&A

  • SQLについて

    レコード1 |レコード2 |レコード3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、レコード1のAAAとBBBは値をそのまま抽出し レコード1のDDDはレコード2とレコード3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? レコード2とレコード3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。

  • SQL文がわからない

    在庫テーブル・入庫テーブル・出庫テーブルがあります。 指定期間内の入庫テーブル・出庫テーブルの数量と在庫テーブルを結合させたいが、どうすればいいでしょうか? 2日ほど悩みましたがどうしても分かりませんでした。 よろしくお願いします <在庫テーブル> コード 個数 aaa   10 bbb   10 ccc   10 <入庫テーブル> コード 個数 日付 aaa   1  1/1 aaa   1  1/2 bbb   1  1/2 aaa   1  1/3 aaa   1  1/4 bbb   1  1/4 ccc   1  1/5 <出庫テーブル> コード 個数 日付 bbb   2  1/2 aaa   2  1/3 bbb   2  1/4 ccc   2  1/4 aaa   2  1/5 <結果(1/2~1/3)> コード 個数 入庫 出庫 aaa   10   2   2 bbb   10   1   4 ccc   10   0   2

    • ベストアンサー
    • MySQL
  • SQLでできること

    SQLだけでできることと、できないことって、一言で言い表せるでしょうか? データベースからデータを取り出すとき、どこまでできて、どこからはphpなど他の言語で処理したらいいのか、とても気になるんです。 もしかして、何でもできるのかな? というのも、今やりたいと思っていることが、 (環境はMySQL+PHP使用で、ブラウザで表示させます) テーブル A(人物のリスト) id|name ------- 1 | aaa 2 | bbb 3 | ccc 4 | ddd テーブル B(人物と成績のリスト) name| point ------------- aaa | 10 bbb | 15 bbb | 10 aaa | 20 bbb | 25 ccc | 30 のようなテーブルがあったとき、 aaaのpointの合計 = 30 bbbのpointの合計 = 50 cccのpointの合計 = 30 dddのpointの合計 = 0 ← テーブルBに載ってない人もいる という人物全員の結果の集計をするには、どうすると最適でしょう? 私がすぐ思いつくのは、テーブルAのデータを配列に読み込んで、それを元に次はテーブルBから、人物別の行を取り出すSQL文を作って、pointを集計するという手順です。他に手段はあるでしょうか?

    • ベストアンサー
    • MySQL
  • 分岐SQLを一発のSQLで実現したい

    【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD Table2 種類、キー1、キー2 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD Table3 種類、キー1、キー2 NULL  AAA  BBB NULL  AAA  CCC NULL  AAA  DDD これをUNIONで取得します。 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD NULL  AAA  BBB NULL  AAA  CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD →いる NULL  AAA  BBB →いらない NULL  AAA  CCC →いらない ↓結果 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。

  • SQL抽出順番

    SQLの質問なんですが 以下のSQLがあるとします。 select カラムA、カラムC from test_table where in ('AAA','BBB','CCC'); ※条件はカラムAの値を使用しています。 結果が AAA 111 BBB 222 CCC 333 と出るとします。 下のように条件を変えたとき where in ('BBB','CCC','AAA'); BBB 222 CCC 333 AAA 111 と抽出と変わるようにしたいのですが、 (in句の左から順番にレコードが抽出したいです) 何か良い方法はありますでしょうか? rowid順で出力されてしまうのでしょうか? 以上です。 よろしくお願いします。

  • 同じ列に2行づつで出力するSQL

    次のようなテーブルがあったとき no | name 1 | aaa 3 | bbb 4 | ccc 6 | ddd (先頭はカラム名です) 以下のように出力するSQLは書けますでしょうか? no1| name1 | no2| name2 1 | aaa | 3 | bbb 4 | ccc | 6 | ddd

  • SQL:Access:プライオリティが異なる2つのテーブルのマージ

    みなさん、こんばんは。 下記のような TBLmain、TBLsub という2つのテーブルをマージするにあたって、 主キーが同じであるレコードがそれぞれのテーブルに存在する場合には、 TBLmain を優先させ、TBLresult のような結果を得たいのですが、 どのように SQL を記述すればよいのでしょうか? DB は Access2000 を使用しています。 どうぞ、よろしくお願いいたします。 TBLmain 1 aaa 4 bbb 8 ccc TBLsub 1 XXX 2 TTT 3 YYY TBLresult 1 aaa 2 TTT 3 YYY 4 bbb 8 ccc

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • selectでテーブルから2つの値を引っ張る

    table 123 id name ------- 1 aaa 2 bbb 3 ccc table 987 from to ------- 1 2 2 3 3 1 という表があります。これを from to ------- aaa bbb bbb ccc ccc aaa という様に表示させるためのSQL分がわかりません。 1つの表から2つを引っ張るのはどうすればいいのでしょうか?

  • オラクルSQLの累計値取得方法について

    教えてください。 3日ほど、悩んでおります。 オラクルのSQLにおいての累計値の取得がどうしてもできません。 会社毎に、毎日の売上累計をSQL一発で取得したいです。 下記例の【★売上累計金額(会社別)】の箇所をレコード毎につみあげて取りたいのですが・・ ただ、対象期間が6ヶ月(約180日)あるので、レスポンスが重要視されています。 なにか、いい方法があれば教えていただきたいです。 例:売上明細テーブル 会社名 売上日  売上金額 ★売上累計金額(会社別) (1)AAA 2005/12/01 1000    1000 (2)AAA 2005/12/02 200   1200 (3)AAA 2005/12/04 300   1500 (4)AAA 2005/12/10 500   2000 (5)AAA 2005/12/03 100   2100 (6)BBB 2005/12/05 300   300 (7)BBB 2005/12/09 200   500 (8)BBB 2005/12/20 100   600 (9)BBB 2005/12/25 1200   1800 (10)CCC 2005/12/05  500    500 (11)CCC 2005/12/08 1000    1500 以上、なんとかご教授お願いいたします!