Извлечь все таблицы и соответствующие столбцы из длинного SQL-запроса

#sql

#sql

Вопрос:

Задача, которую я пытаюсь решить, — получить все таблицы из длинного SQL-запроса и его соответствующих столбцов.

Например.

 SELECT 
t1.id, t1.gender, t1.name,
t2.age, t2.salary
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.id
  

Требуемый результат:

 {'table1': ['id', 'gender', 'name'], 'table2': ['age', 'salary']}
  

Я рассматривал возможность использования разделения строк и т.д. Для получения всех имен таблиц и на основе псевдонима (если он доступен) получить столбцы.
Но это становится намного сложнее, если есть несколько объединений и, возможно, также UNION s.

Есть ли доступная библиотека или умный способ сделать это?

Комментарии:

1. Вам нужно написать синтаксический анализатор sql. Удачи с этим! Вопросы с просьбой рекомендовать библиотеки явно не по теме здесь, на SO.

2. Вам нужен вывод, подобный имени таблицы и ее столбцам? не данные?

3. @MansiRoval да, точно, мне «только» нужны имена таблиц и имена их столбцов

4. почему добавлено объединение? t1.id=t2.id ? вы хотите сравнить имя столбца? Если да, имеют ли table1 и table 2 одинаковое имя столбца?

5. Соединение добавляется, потому что реальные запросы имеют несколько соединений, в которых соединены таблицы. В этом случае речь идет не о данных, как указано, а о том, какие столбцы находятся в select (будут в наборе данных) и из каких таблиц они поступают

Ответ №1:

Если это только для 1 запроса, я бы посоветовал использовать MS Excel и фильтровать по псевдониму таблицы. Сгенерируйте оператор select с помощью MS Excel, и вы могли бы создать что-то вроде этого:

 SELECT 
'table1:', t1.id, t1.gender, t1.name,
'table2:',t2.age, t2.salary
FROM table1 t1
LEFT JOIN table2 t2
ON t1.id = t2.id
  

Комментарии:

1. Мы получили большую коллекцию запросов, и запросы состоят из > 100 строк каждый

Ответ №2:

В случае, если это поможет. Возьмите имя столбца из All_TAB_COLUMN и поверните его. Тем не менее, это не точный результат, который вы хотите.

  select * from (
 select TABLE_NAME,COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME in 
 ('Table1','Table2'))
 pivot
 (
  max(table_name)
  for COLUMN_NAME in ('gender','name','age','salary')
  )
 order by 1;