有 2 个表格可供比较。
表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
现在的问题是我需要这个解决方案是动态的。 我的意思是我上面用粗体标记的选择中的字段列表应该基于子集表(TAB2)的字段
第 1 步应该是获取 TAB1 中的字段列表 步骤 2 应该是选择从 TAB1 和 TAB2 中选取这些字段(相应的字段名称始终相同)并计算它们的差异。 所以基本上预期的 select 语句应该是这样的。 选择基于 TAB2 字段列表的动态字段列表 FROM TAB1 INNER JOIN TAB2 ON KEY = KEY
对于 TAB1 中的字段列表,我可以转到元数据表并获取它。 第2步让我困惑.. 任何帮助都会很棒..
谢谢!
最佳答案
SQL 语言要求您引用的列和表在准备时设置。没有办法解决这个问题。
因此,您需要编写代码来在字符串中创建 SQL 查询,然后运行该查询。
我会这样做:
运行
SHOW COLUMNS FROM TAB2
这样的 SQL 查询来获取该表中的字段列表。在代码中启动一个数组,该数组将成为查询的列选择列表。
对于 SHOW COLUMNS 结果中的每个字段,将一个元素添加到选择列表数组中。
使用数组作为查询选择列表形成新的 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 查询,然后执行它。
关于mysql - SQL 中 Select 语句中的动态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40182599/