我有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&的每一列的值。表2
例如: - 如果表-1和& table-2有一个名为name的列,我需要比较它..
如何通过columnnname访问结果集,即使用Pyodbc,
即resultset.table1.name = resultset.table2.name
答案 0 :(得分:1)
使用ISO信息架构视图(我在中使用SQL Server) 例子)返回每个表的列名,替换 适当的数据库和模式参数值。
将结果列表合并到包含两个表中存在的列名的集合中。
使用此集合构建一个表示列名的字符串,以便从每个表中进行选择,通过在表名前添加前缀来对每列进行别名。定义列别名将允许您按表区分列。
执行选择查询和打印值以进行比较。
# 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
可能有一种不太复杂的方式,但它让我不知所措。