我有一个SQL数据库,其中的“主表”仅包含数据库中其余表的ID。 (已经处理了重复项。)我想遍历数据库中其余的每个表,在“主表”中添加一列,如果“主表”中的每个ID都在该列中添加“ 1”表”存在于小列表中,否则添加“ 0”。
到目前为止,我已经尝试了一些查询,但是它们看起来很慢。我正在使用的表每个将包含数千个ID,所以我想找到一种快速的方法。
到目前为止,我的Python代码如下:
def main():
table_list = init() #Gets a list of others tables in the database.
for ltab in table_list:
id_list = getids(ltab) #Gets the ids for each smaller table.
cursor.execute("ALTER TABLE " + table + " ADD " + ltab + " BIT;")
cnx.commit()
for ID in id_list:
(...)
接下来(作为初学者)我将要做的是遍历每个ID并对照“主表”进行检查,但我正在寻找一种更快的方法。
答案 0 :(得分:0)
由于您正在处理元数据,因此我更喜欢使用information_schema,因此您将只有一个查询来获取数据。
例如:
#create table Test1(id_1 integer, title varchar(100));
#create table Test2(id_2 integer, title varchar(100));
#insert into Test1(id_1, title) values(1, "Hello");
#insert into Test2(id_2, title) values(1, "Hello");
#insert into Test1(id_1, title) values(2, "Hello");
#insert into Test2(id_2, title) values(2, "Hello");
select column_name,
sum( if( TABLE_NAME = 'Test1', 1, 0 ) ) as Test1,
sum( if( TABLE_NAME = 'Test2', 1, 0 ) ) as Test2
from information_schema.columns
where TABLE_SCHEMA = 'your_schema'
and column_name like '%id%'
group by column_name;
会给你类似的东西
column_name Test1 Test2
1 accepterid 0 0
2 acl_id 0 0
3 id_1 1 0
4 id_2 0 1
因此,在上面的查询中,您可以对其进行调整
_tables = ','.join([("sum( if( TABLE_NAME = '%s', 1, 0 ) ) as %s" % (i,i)) for i in table_list ])
query = """
create view master as(
select column_name, %s
from information_schema.columns
where TABLE_SCHEMA = 'your_schema'
and column_name like '%id%'
group by column_name;)
""" % (_table,)
cursor.execute(query)