2016-08-29 4 views
1

Я хочу проанализировать сложный SQL, который имеет (внутреннее соединение, внешнее объединение) и получает имена таблиц, используемые в SQL.Python-Parsing SQL using pyparsing

Я могу получить имена таблиц, если это простой выбор, но если у SQL есть внутреннее соединение, левое соединение, как показано ниже, тогда результат дает только первую таблицу.

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

Я использую программу, аналогичную той, что присутствует в приведенной ниже ссылке Павла.

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, хранящихся чтобы выполнить большую часть работы, я не уверен, что это возможно для вас. Но это, вероятно, единственный способ правильно разобрать * complex * SQL. Даже нетривиальный Oracle SQL почти невозможно разобрать. С 2175 ключевыми словами, большинство из них не зарезервировано, синтаксический анализ Oracle SQL - огромная задача. Вот почему вам нужен ярлык, например, использование метода «EXPLAIN PLAN» в этом ответе. –

ответ

-1

Ваш вопрос будет зависеть от того, какую платформу Sql вы используете.

Я отвечу, предполагая, что вы используете MsSql. Та же логика должна быть реализована на всех платформах Sql, которые, однако, думали, что изменения синтаксиса.

Столы уникальны комбинацией владельца и стола. Я делаю выбор, который возвращает # Owner # TableName # в сценарии Python, который я написал, чтобы извлечь все данные во все таблицы в текстовые файлы. Основная форма этого предполагается, что вы не имеете несколько таблиц одного и то же имя с другим владельцем является:

Выберите имя из SysObjects где xtype = порядок «U» по имени

Это дает вам список все столы. Затем вы берете этот список и делаете «Выберите * из [имя таблицы из другого запроса]» прокрутите до тех пор, пока у вас не будет всех таблиц, найденных вами при выборе из 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

Спасибо, Пол за ответ, он работает как ожидалось. Я получаю все имена таблиц из SQL. – user6771430

+0

Можно ли получить все столбцы соединения также из SQL-запроса? – user6771430

+0

Почему «стол *»? Я могу сказать, что он позволяет больше, чем один, но я не могу найти никаких документов на нем. – dfrankow