
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つの期間は存在しない)
実行結果はあくまで私の考えで、
異常を検知できればどのような形でも大丈夫です。
なにかあれば補足します。
どうぞよろしくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
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
))
/
No.2
- 回答日時:
こんな感じですか
SELECT コード, 適用開始日, 適用終了日 FROM AAA
MINUS
SELECT コード, 適用開始日, 適用終了日 FROM BBB
MINUS
SELECT コード, TO_CHAR(TO_DATE(適用終了日, 'YYYYMMDD') + 1, 'YYYYMMDD'), '99999999'
FROM BBB
WHERE 適用終了日 <> '99999999'
/
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'));
とかでどうでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- その他(Microsoft Office) パワークエリの複数ファイルのデータ統合について 3 2022/07/14 17:06
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- JavaScript JavaScript|特定URLだった時、特定の要素を変更するコードの書き方を教えてほしいです 2 2023/08/25 21:43
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
平成20年 春期 基本情報技術者 ...
-
SQL 特定のカラムが最大値のレ...
-
「SQLの絵本」について
-
10営業日前の日付を取得したい...
-
SQLにて縦を横へ展開
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
OracleのSQL*PLUSで、デー...
-
Accessで別テーブルの値をフォ...
-
レコードが存在しなかった場合
-
oracleの分割delete
-
select insertで複数テーブルか...
-
select句副問い合わせ 値の個...
-
[Access]異なるレコード間の文...
-
DataGridViewの内容をDBに反映...
-
DataGridViewの、選択されてい...
-
差し込み印刷のレコード数について
-
SQL>UPDATEと同時にその件数を...
-
ADO VBA 実行時エラー3021
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
沿線コード
-
SQLの実行結果が異なる
-
CREATE テーブルでの複数外部...
-
Order by句でバインド変数を使...
-
【SQL】登録されているかを比較...
-
ヤマト急便のチェックデジット...
-
困っています。ORACLE_SQL 複数...
-
SQLの質問です。
-
SQLにて縦を横へ展開
-
SQLの書き方
-
10営業日前の日付を取得したい...
-
平成20年 春期 基本情報技術者 ...
-
SQLについて
-
SQLの集約の方法
-
同一コード毎に最新の名称を取...
-
Oracleビュー:同じ意味で異な...
-
オラクル 名称をコードに変換
-
SQL 特定のカラムが最大値のレ...
-
SQLについて
おすすめ情報