说我有3个要用于构建新查询的数据列表。我需要获取这些数据列表,然后返回找到内容的那些列表的值。
所以我的问题是这个
是否有获取列表并将其用作列的标准方法?
我将需要使用多个列表作为列,其中一列是“ JOIN ON”或“ WHERE IN”部分。
第一个查询的结果用于构建我的3个列表。
说我取回这些数据:
[[ID, TYPE, OTHER],
[1, C, S],
[2, C, O],
[3, D, D],
[4, D, H]]
然后将该表/ 2D数组转换为以下Python列表:
[1, 2, 3, 4]
[C, C, D, D]
[S, O, D, H]
现在我要使用这2个列表作为select语句中的列,如下所示:
select [C, C, D, D] as TYPE # These 2 list are needed to return in the correct order
,[S, O, D, H] as OTHER # as it relates to [1, 2, 3, 4] in the WHERE.
,table.value
,table.color
From table
where table.value in [1, 2, 3, 4] # one list is used to deal with the where
table
包含2列:
VALUE COLOR
1 Red
2 Green
3 Blue
4 Black
结果应如下所示:
TYPE OTHER VALUE COLOR
C S 1 Red
C O 2 Green
D D 3 Blue
D H 4 Black
答案 0 :(得分:0)
更新:
1,将表格转换为3个列表:
import cx_Oracle
import pandas
db = cx_Oracle.connect('*******', '********', '*******')
conn = db.cursor()
sql_test = '''SELECT * FROM TEST'''
sql_table = '''SELECT * FROM "TABLE" '''
df_test = pandas.read_sql_query(sql_test,db)
df_table = pandas.read_sql_query(sql_table,db)
ser_aggCol=df_test.aggregate(lambda x: [x.tolist()], axis=0).map(lambda x:x[0])
print(ser_aggCol, sep='\n', end='\n\n\n')
print(ser_aggCol['ID'])
print(ser_aggCol['TYPE'])
print(ser_aggCol['OTHER'])
输出:
2,使用while循环逐行连接数据帧。
sql_max = '''SELECT MAX(ID) FROM TEST'''
conn.execute(sql_max)
max_id = 0
for result in conn:
max_id = result[0]
print(max_id)
i = 0
sql_first_row = '''select \'''' + ser_aggCol['TYPE'][i] + '''\' as TYPE, \'''' + ser_aggCol['OTHER'][i] + '''\' AS OTHER, VALUE, COLOR FROM "TABLE" WHERE VALUE = '''+ str(ser_aggCol['ID'][i])
df_result = pandas.read_sql_query(sql_first_row,db)
while i + 1 <= max_id - 1:
new_sql = '''select \'''' + ser_aggCol['TYPE'][i+1] + '''\' as TYPE, \'''' + ser_aggCol['OTHER'][i+1] + '''\' AS OTHER, VALUE, COLOR FROM "TABLE" WHERE VALUE = '''+ str(ser_aggCol['ID'][i+1])
df_new = pandas.read_sql_query(new_sql, db)
df_result = pandas.concat([df_result,df_new])
i = i + 1
print(df_result)
输出:
原始帖子:
我的方法是:
1,将SQL结果读入数据框
pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None)
2,使用熊猫加入数据框
DataFrame.join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
测试:
我的新PC上没有SQL Server客户端,因此仅在Oracle中创建了这两个表。您只需要在Python中添加SQL Server连接。 让我知道你是否被卡在这里。
在Oracle中创建了两个表:
测试:
表格:
然后是Python:
import cx_Oracle
import pandas
db = cx_Oracle.connect('********', '********', '********')
conn = db.cursor()
sql_test = '''SELECT * FROM TEST'''
sql_table = '''SELECT * FROM "TABLE" '''
df_test = pandas.read_sql_query(sql_test,db)
df_table = pandas.read_sql_query(sql_table,db)
print(df_test)
print(df_table)
print(df_test.set_index('ID').join(df_table.set_index('VALUE')))
输出:
ID TYPE OTHER
0 1 C S
1 2 C O
2 3 D D
3 4 D H
VALUE COLOR
0 1 Red
1 2 Green
2 3 Blue
3 4 Black
ID TYPE OTHER COLOR
1 C S Red
2 C O Green
3 D D Blue
4 D H Black
答案 1 :(得分:0)
好的,这就是我必须解决的问题。
我将在SQL Server上创建一个新的数据库,然后与该工具进行交互的所有必需表将取代在客户端上管理数据。
然后,我将使程序根据使用该工具的用户在每个表中插入和删除行。
获取用户名很简单:
import os
print(os.getlogin())
因为在99%的时间内一次要为10个用户中的任何一个添加和删除的行少于100行,这将足以处理工作。
与我目前的UNION
方法相比,该解决方案效率更高,并且还允许每个用户仅查看和使用与其登录相关的数据。
看到每个表可能永远不会超过10,000行,即使没有主键,我也不认为这是个大问题。
我仍会悬赏,以查看是否有人能提出更好的解决方案,因为这对我的工作很重要,但就目前而言,这已经足够了。