有两个表要比较。
表1是包含所有字段的检查表:
TAB1
KEY F1 F2 F3 F4
1A 70 61 58 91
1B 61 97 73 53
1C 96 16 32 92
表2是表1的子集,并从不同的源加载。 理想情况下,两个表中的相应数据应该匹配,但实际上会有差异。例如,下面,键1C的列F3中的值是不同的......其他所有内容都是相同的。
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
现在,问题是我需要这个解决方案是动态的。 我的意思是上面以粗体标记的选择中的字段列表应该基于子集表(TAB2)的字段
步骤1应该是获取TAB1中的字段列表 如果您从TAB1和TAB2中拾取这些字段(相应的字段名称将始终相同),则应选择步骤2,并计算它们的差异。 所以基本上预期的select语句看起来应该是这样的。 选择基于TAB2字段列表的动态字段列表 FROM TAB1 INNER JOIN TAB2 ON KEY = KEY
对于TAB1中的字段列表,我可以转到元数据表并获取它。 第2步困惑我.. 任何帮助都会很棒..
谢谢!
答案 0 :(得分:1)
SQL语言要求您引用的列和表在准备时设置。没有办法解决这个问题。
因此,您需要编写以字符串形式创建SQL查询的代码,然后运行该查询。
这是我将如何做到的:
运行SHOW COLUMNS FROM TAB2
之类的SQL查询以获取该表中的字段列表。
在代码中启动一个数组,该数组将成为查询列的选择列表。
对于SHOW COLUMNS结果中的每个字段,将一个元素添加到选择列表数组中。
使用数组作为查询select-list形成一个新的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查询,然后执行它。