0

我有 2 个包含 150 列的表,并尝试加入这些表并一一获取结果集并处理它们:

qry = '''select a.*, b.*
         from table_a a
              full outer join table_b b
         where a.id = b.id'''
table_row = conn.execute(qry) #execute method yields a generator

现在,我需要访问生成器的结果集并确定 table-1 和 table-2 的每一列的值

例如:- 如果 table-1 & table-2 有一个名为 name 的列,我需要比较它..

我如何通过 columnnname 访问结果集,我使用 Pyodbc,

即结果集.table1.name = 结果集.table2.name

4

1 回答 1

1
  1. 使用 ISO 信息架构视图(我在示例中使用 SQL Server)返回每个表的列名,并根据需要替换数据库和架构参数值。

  2. 将结果列表合并到一个集合中,其中包含两个表中都存在的列名。

  3. 使用此集合构建一个字符串,表示要从每个表中选择的列名,并通过以表名作为前缀来为每个列设置别名。定义列别名将允许您按表区分列。

  4. 执行选择查询并打印值进行比较。

代码示例

# assumes connection, cursor already setup
# build SQL for retrieving column names
sql = '''SELECT COLUMN_NAME
         FROM INFORMATION_SCHEMA.COLUMN
         WHERE TABLE_CATALOG = ? AND TABLE_SCHEMA = ?
               AND TABLE_NAME = ?'''

# get column names from table_a
rows = cursor.execute(sql, ('database', 'schema', 'table_a')).fetchall()
table_a_columns = [column[0] for column in rows]

# get column names from table_b
rows = cursor_b.execute(sql, ('database', 'schema', 'table_b')).fetchall()
table_b_columns = [column[0] for column in rows]

# get unique matching columns from lists
matches = set(table_a_columns).intersection(table_b_columns)

# get string of column names to use in query, setting column alias prefixed with
# table name for each column
column_alias = 'a.{0} as a_{0}, b.{0} as b_{0}'
columns = ', '.join([column_alias.format(column) for column in matches])
sql = 'SELECT {} FROM table_a a FULL OUTER JOIN table_b b ON a.id = b.id'
sql = sql.format(columns)

# print values to compare
for row in cursor.execute(sql):
    print row

可能有一种不太复杂的方法,但它让我望而却步。

于 2013-05-03T21:03:50.253 回答