mysql - SQL 中 Select 语句中的动态字段

标签 mysql sql hana

有 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 查询,然后运行该查询。

我会这样做:

  1. 运行 SHOW COLUMNS FROM TAB2 这样的 SQL 查询来获取该表中的字段列表。

  2. 在代码中启动一个数组,该数组将成为查询的列选择列表。

  3. 对于 SHOW COLUMNS 结果中的每个字段,将一个元素添加到选择列表数组中。

  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 查询,然后执行它。

关于mysql - SQL 中 Select 语句中的动态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40182599/

相关文章:

c# - 使用 Mysql 设置 Entity Framework 6 - 代码优先

mysql - 选择连接条件错误的查询

sql - HANA列表/显示表SQL命令

mysql - 选择上次插入的所有行

php - 使 fetch_assoc 完全匹配 fetch_all

MySQL 不会关闭 : "Stop server: ERROR! MySQL server PID file could not be found!"

SQL Server - 如果列包含值,则按 ID 分组

java - HQL 子查询查询选择

mysql - FROM 和 JOIN 上的错误 SQL 语法

python - 无法在 Python 中执行 SQL HANA 查询 - 语法错误