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

时间:2016-10-21 17:45:15

标签: mysql sql hana

有两个表要比较。

表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步困惑我.. 任何帮助都会很棒..

谢谢!

1 个答案:

答案 0 :(得分:1)

SQL语言要求您引用的列和表在准备时设置。没有办法解决这个问题。

因此,您需要编写以字符串形式创建SQL查询的代码,然后运行该查询。

这是我将如何做到的:

  1. 运行SHOW COLUMNS FROM TAB2之类的SQL查询以获取该表中的字段列表。

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

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

  4. 使用数组作为查询select-list形成一个新的SQL查询。

  5. 这里有一些快速(未经测试)的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查询,然后执行它。