人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQL文を見って結合条件が足りないSQL文があったら検出するちょっと難しい課題をやってますがうまくできません。みんなの力を貸してください。簡単なアトバイスでも構いません。
例として、
select *
from
TYM00010 t10,tym00011 t11
where
t11.BILL_DATA_HOUSE_END=t11.BILL_DATA_HOUSE_END
and
t10.ERR_NUM=t11.ERR_NUM
こんなsql文がある。
テーブルが書いてあるテキストを見て検索することにします。
tab区切りになっているとします。
FORMAT.txt
テーブル名 カラム名 属性 ○はプライマリーキー
TYM00010CONFIDENCE_NUMNUMBER5○
TYM00010ERR_NUM NUMBER5 ○
TYM00010BILL_DATA_HOUSE_END NUMBER5 ○
TYM00010INSIDEWEB_FLG CHAR1

tym00011CONFIDENCE_NUMNUMBER5 ○
TYM00011ERR_NUMNUMBER5 ○
TYM00011BILL_DATA_HOUSE_ENDNUMBER5 ○
TYM00011INSIDEWEB_FLGCHAR1

なんかいい方法があったらお願いいたします。
どなたかご教授していただければ本当に幸いです。
よろしくお願いいたします。

●質問者: kimu_507
●カテゴリ:コンピュータ
✍キーワード:Char Number SELECT SQL カラム名
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●27ポイント

t11.BILL_DATA_HOUSE_END=t11.BILL_DATA_HOUSE_END

の箇所は

t10.BILL_DATA_HOUSE_END=t11.BILL_DATA_HOUSE_END

にしたほうがいいでしょう。


http://q.hatena.ne.jp/1247799971

◎質問者からの返答

すみません 書き間違いです。

t11.BILL_DATA_HOUSE_END=t11.BILL_DATA_HOUSE_END

の箇所は

t10.BILL_DATA_HOUSE_END=t11.BILL_DATA_HOUSE_END

として考えてください。


2 ● Gosogoso
●27ポイント

さまざまなSQLを保持するリストを解析して、結合条件が足りないSQLを検出する。

結合条件を確かめる情報として format.txt を参照してください。

という処理ですよね?

それ(format.text)だけの情報では無理ではないでしょうか?

さしあたり、この程度の前提条件が必要かと思います

「プライマリキー同士以外での結合は行わない」

「同じ名前の列は、必ず同じ意味の列である(→違う列は意味の違う列である)」

「複合キーとなっている列数が違うテーブル同士の結合は行わない(もしくは、行っている場合は妥当性にかかわらずNG)」

前提条件があるとして

ざっくりとこんな処理になると思います

  1. format.txt を解析し、HashTable 辺りにぶち込んでおく
  2. リスト中の SQL を崩す
    • SQL をパースするこんなのがありました → http://www.gibello.com/code/zql/~
    • 使えなければ、自作パーサーを作る他ないと思います
  3. where 句(もしくは JOIN 句)を抜き取りチェック
    1. 条件文毎に分割
    2. 参照されているテーブルのプライマリキー数が同じか? 違う → NG
    3. 参照されているテーブルのプライマリキー分の where 条件があるか? ない → NG
    4. 条件文を右辺と左辺の分割
    5. where 条件の左辺と右辺が同じ名前の列か? 違う → NG
  4. 次のリストへ(2から繰り返し)

kimu_507 さんのやり方とほぼ変わりませんね・・・

◎質問者からの返答

なるほどですね、すごく参考になりました。本当に有難うございます。これからもよろしくお願いします


3 ● ふるるP
●26ポイント

まずはER図について勉強することを薦めます。

TYM00010の1レコードに対し、TYM00011は何レコードあるのかを考えましょう。

1:1でしょうか? 1:N でしょうか? 1:0は ありうるのでしょうか?

1:1(1:0も含む)であるならTYM00011の一意キー(プライマリキーは一意キーのひとつです)が結合条件になるでしょう。

お書きのテーブルレイアウトをみると、プライマリーキーは3つの列からできているので、結合条件も3つあるはず、と考えます。

http://ja.wikipedia.org/wiki/%E5%AE%9F%E4%BD%93%E9%96%A2%E9%80%A...

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ