2016-08-29 4 views
1

(内部結合、外部結合)を持つ複合SQLを解析し、S​​QLで使用されるテーブル名を取得します。Python-Parsarsingを使用したSQLの解析

単純な選択の場合はテーブル名を取得できますが、SQLに内部結合がある場合は、以下のように左結合が行われ、結果は最初のテーブルのみが与えられます。

select * from xyz inner join dhf on df = hfj where z > 100 

私は、下記のリンクにあるものと類似のプログラムをPaulによって使用しています。

http://pyparsing.wikispaces.com/file/view/select_parser.py/158651233/select_parser.py

誰かがどのようにあなたの質問は、あなたが使用しているSQLどのようなプラットフォームに依存しようとしている

select * from xyz inner join dhf on df = hfj where z > 100. 
+0

は、これは、http://stackoverflow.com/q/35295458/409172の複製である可能性があります。そのソリューションには、ライブデータベースとPL/SQLストアドが必要ですほとんどの作業を行う手順は、それが実現可能かどうかはわかりません。しかし、これはたぶん*複雑な* SQLを正しく解析する唯一の方法です。たとえ軽いOracle SQLであっても、解析することはほとんど不可能です。 2175個のキーワードを使用すると、予約されていないほとんどのOracle SQLの解析は大きな課題です。そのため、その答えに 'EXPLAIN PLAN'メソッドを使うような、ショートカットが必要なのです。 –

答えて

-1

以下のようなSQLで使用されるすべてのテーブルを得るために私を伝えることができます。

MsSqlを使用していると仮定して回答します。シンタックスが変更されたと考えられるすべてのSQLプラットフォームで同じロジックを実行できるはずです。

テーブルは、所有者とテーブルの組み合わせによって一意です。私はすべてのテーブルのすべてのデータをテキストファイルに抽出するために書いたPythonスクリプトで#Owner#TableName#を返すselectを実行します。あなたが別の所有者と同じ名前の複数のテーブルを持っていないと仮定すると、この基本的な形式は次のとおりです。名前

によってXTYPE =「U」の順序は、これはあなたのすべてのリストを与えるSYSOBJECTSから

選択名テーブル。 それから、 "Select * from [他のクエリのテーブル名]" を実行して、Sysobjectsから選択したときに見つかったすべてのテーブルを取得します。

システムテーブルにアクセスできると仮定すると、すべてのSqlプラットフォームで同じタイプのものが実用的です。

+0

select * from syscolumns を選択すると、列名を表示できます。 –

+0

あなたは質問を誤解しました。 OPは、テーブル名のためにdbを照会したくない場合、投稿されたSQLステートメントからテーブル名を抽出したいと考えています。 – PaulMcG

0

このパーサーは長い時間前に書かれたもので、結果名に複数の値を扱っても、後になるまで来なかった。

single_source = ((Group(database_name("database") + "." + table_name("table*")) | table_name("table*")) + 

single_source = ((Group(database_name("database") + "." + table_name("table")) | table_name("table")) + 

私はselect_stmtパーサを通して、あなたのサンプルステートメントを実行すると、私は今、この取得:あなたが引用したパーサで

変更このライン

select * from xyz inner join dhf on df = hfj where z > 100 
['SELECT', ['*'], 'FROM', 'xyz', 'INNER', 'JOIN', 'dhf', 'ON', ['df', '=', 'hfj'], 'WHERE', ['z', '>', '100']] 
- columns: ['*'] 
- table: [['xyz'], ['dhf']] 
    [0]: 
    ['xyz'] 
    [1]: 
    ['dhf'] 
- where_expr: ['z', '>', '100'] 
+0

返信いただきありがとうございます。期待通りに動作しています.Iamはすべてのテーブル名をSQLから取得しています。 – user6771430

+0

SQLクエリからもすべての結合列を取得できますか? – user6771430

+0

なぜ "テーブル*"ですか?私は1つ以上のことを許可すると言うことはできますが、その上にドキュメントを見つけることはできません。 – dfrankow