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
テーブル名    カラム名      属性      ○はプライマリーキー
TYM00010 CONFIDENCE_NUM NUMBER 5 ○
TYM00010 ERR_NUM NUMBER 5 ○
TYM00010 BILL_DATA_HOUSE_END NUMBER 5 ○
TYM00010 INSIDEWEB_FLG CHAR 1

tym00011 CONFIDENCE_NUM NUMBER 5 ○
TYM00011 ERR_NUM NUMBER 5 ○
TYM00011 BILL_DATA_HOUSE_END NUMBER 5 ○
TYM00011 INSIDEWEB_FLG CHAR 1

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

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2009/07/24 12:10:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント27pt

   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

id:kimu_507

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

   t11.BILL_DATA_HOUSE_END=t11.BILL_DATA_HOUSE_END

の箇所は

   t10.BILL_DATA_HOUSE_END=t11.BILL_DATA_HOUSE_END

として考えてください。

2009/07/17 14:56:33
id:Gosogoso No.2

回答回数3ベストアンサー獲得回数0

ポイント27pt

さまざまな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 さんのやり方とほぼ変わりませんね・・・

id:kimu_507

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

2009/07/18 00:06:48
id:frkw2004 No.3

回答回数194ベストアンサー獲得回数21

ポイント26pt

まずは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...

  • id:kimu_507
    1、やり方としてはfrom句中の各テーブル名(別名があったら別に検出しておく)を取得してからテキストを一行ずつ読み込んで取得したテーブル名と〇が付いている行を先取得する
    2、where句で結合条件を取得してから各テーブル名(from句中で取得したテーブル名と一致した物)と各カラム名を取得する
    3、1で取得した行で2で取得したテーブル名とカラム名が一致しない行だけ取得して、中から各テーブル名でまた同じカラム名が残っていたらそのSQL文を出力する
    こんな感じでやろと思って始めましだが全然うまくできません。
    もしかしたら考え方が間違っていますか?
  • id:pahoo
    要求要件が分かりません。

    1)「結合条件が足りない」とはどういう状態ですか? 例示お願いします。
    2)何から検出するのですか? 質問にある "FORMAT.txt" という1つのテキストファイルから検出するだけでよいのですか?  "FORMAT.txt" には小文字のテーブル名が1行だけありますが、これは別テーブル(3つめのテーブル)として解釈すればいいのですか?
    3)処理環境は何ですか? OS、言語などを提示してください。
  • id:kimu_507
    pahooさん いつもお世話になってます。

    >1)「結合条件が足りない」とはどういう状態ですか? 例示お願いします。
    上に例として書いてあるSQL文見ると
    t10.BILL_DATA_HOUSE_END=t11.BILL_DATA_HOUSE_END
    t10.ERR_NUM=t11.ERR_NUM
    二つの結合条件があります、
    でもFORMAT.txtの中を見たらプライマリーキーが付いている物がもう一つあります、つまり一行目のカラム名(CONFIDENCE_NUM )も結合条件に入れなければいけないことなのに結合条件の中にない
    事は「結合条件が足りない」事になります。
    *各テーブルに同じカラム名で両方プライマリーキーが付いてある物は結合条件に入れること

    >2)何から検出するのですか? 質問にある "FORMAT.txt" という1つのテキストファイルから検出するだけでよいのですか? 

    sql文がListの中にあってその中て結合条件が足りないSQL文を検出する事です。
    "FORMAT.txt"は結合条件が足りるがチェックする物とします。

    >"FORMAT.txt" には小文字のテーブル名が1行だけありますが、これは別テーブル(3つめのテーブル)として解釈すればいいのですか?
    小文字大文字区別しない事です。つまりテーブルは全部2つだけです

    >3)処理環境は何ですか? OS、言語などを提示してください。

    Windows Vista で
    eclipse==java を使ってやってます。

    説明不足で、すみません

    またよろしくお願いいたします 
  • id:pahoo
    kimu_507さん、コメントにて追加情報をありがとうございました。
    申し訳ありませんが、現在、手元に適当な Java環境がないため適切な回答ができません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません