2016-10-21 2 views
0

Есть 2 таблицы для сравнения.Динамические поля в инструкции выбора в SQL

Таблица 1 является проверка таблицы, которая содержит все поля:

TAB1 
KEY F1 F2 F3 F4 
1A 70 61 58 91 
1B 61 97 73 53 
1C 96 16 32 92 

Таблица 2 представляет собой подмножество таблицы 1 и загружаются из другого источника. В идеале соответствующие данные в обеих таблицах должны совпадать, но практически, будут различия. Например, ниже значение в столбце F3 для ключа 1C различно. Все остальное - то же самое.

TAB2 
KEY F1 F3 
1A 70 58 
1C 96 10 

Конец вывода мне нужно сравнение

KEY F1_CHK F1 F1_DELTA F3_CHK F3 F3_DELTA 
1A 70  70 0   58 58 0 
1C 96  96 0   32 10 22 

поэтому выбор я смотрю на это как

select TAB1.F1, TAB2.F1 , (TAB1.F1-TAB2.F1) , TAB1.F3, TAB2.F3 , (TAB1.F3-TAB2.F3) 
FROM TAB1 INNER JOIN 
    TAB2 
    ON KEY = KEY 

Теперь проблема в том, что мне нужно это решение быть динамичным , Я имею в виду список полей в избранных I, выделены жирным шрифтом выше, должны быть основаны на полях таблицы подмножества (TAB2)

Шаг 1 должен быть, чтобы получить список полей в TAB1 Шаг 2 должен быть вы выбрали те поля из TAB1 и TAB2 (соответствующие имена полей всегда будут одинаковыми), а также вычислить их разницу. Так что в основном ожидаемый оператор select должен выглядеть так. выбрать динамический список полей на основе списка TAB2 поля ИЗ TAB1 INNER JOIN TAB2 ON KEY = KEY

Для списка полей в TAB1, я могу пойти в таблицу метаданных и Пиль .. Шаг 2 путает me .. Любая помощь будет отличной ..

Спасибо!

ответ

1

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

Поэтому вам нужно написать код, который создает SQL-запрос в строке, а затем выполнить этот запрос.

Вот как я бы это сделать:

  1. Выполнить SQL-запрос как SHOW COLUMNS FROM TAB2, чтобы получить список полей в этой таблице.

  2. Запустите массив в коде, который станет столбцом выбора столбцов для вашего запроса.

  3. Для каждого поля результата SHOW COLUMNS добавьте элемент в массив select-list.

  4. Создайте новый SQL-запрос, используя массив в качестве списка выбора запроса.

Вот некоторые быстро (непроверенные) код Python, чтобы сделать что-то вроде того, что я имею в виду:

db = MySQLdb.connect(...) 

cur = db.cursor(MySQLdb.cursors.DictCursor) 
cur.execute("""SHOW COLUMNS FROM TAB2""") 
select_list = [] 
for col in cur.fetchall(): 
    select_list.append('TAB1.{field}'.format(field=col['Field'])) 
    select_list.append('TAB2.{field}'.format(field=col['Field'])) 
    select_list.append('TAB1.{field}-TAB2.{field}'.format(field=col['Field'])) 

sql = """ 
    SELECT {select_list} 
    FROM TAB1 INNER JOIN TAB2 ON KEY = KEY 
    """.format(select_list=','.join(select_list)) 

cur.execute(sql) 
... read results ... 

Я ничего не знаю о написании кода для HANA, но принцип тот же. Вам нужно написать код для создания SQL-запроса, а затем выполнить его.

Смежные вопросы