Быстрый способ проверить соответствие идентификаторов в главной таблице?

#python #mysql #sql #python-3.x

#python #mysql #sql #python-3.x

Вопрос:

У меня есть база данных SQL с «главной таблицей», содержащей только идентификаторы из остальных таблиц в базе данных. (Дубликаты уже обработаны.) Я хочу выполнить итерацию по каждой из остальных таблиц в моей базе данных, добавив столбец в «главную таблицу», а затем добавив «1» к столбцу, если каждый идентификатор из «главной таблицы» существует в небольшом списке, и добавив «0» в противном случае.

Я уже пробовал несколько запросов, но они кажутся довольно медленными. Таблицы, которые я использую, будут содержать несколько тысяч идентификаторов каждая, поэтому я хотел бы найти быстрый метод.

Мой код на 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:
            (...)
  

Что бы я сделал дальше (как новичок), так это перебрал бы каждый идентификатор и сверил его с «главной таблицей», но я ищу более быстрый способ сделать это.

Ответ №1:

Поскольку вы имеете дело с метаданными, я предпочитаю использовать 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)