2016-11-30 2 views
0

У меня есть довольно сложный Mysql запрос:Преобразование сложной MySQL запрос UPDATE Заявление о

SELECT 
    metabase_field.description, rows_to_copy.description, 
    metabase_field.display_name, rows_to_copy.display_name 
FROM 
    metabase_field LEFT JOIN (select id as table_id, name as t_name from metabase_table) metabase_field_table ON metabase_field.table_id=metabase_field_table.table_id, 
    (
     SELECT metabase_field.name as name, metabase_field_table.t_name as t_name, metabase_field.display_name as display_name, metabase_field.description as description, metabase_field.special_type as type 
     FROM metabase_field 
     LEFT JOIN (select id as table_id, name as t_name, db_id, active, visibility_type from metabase_table) metabase_field_table ON metabase_field.table_id = metabase_field_table.table_id 
     LEFT JOIN metabase_database metabase_field_table_database ON metabase_field_table.db_id = metabase_field_table_database.id 
     where metabase_field_table.active=1 and metabase_field_table.visibility_type is null and metabase_field_table_database.name = 'Prod' 
    ) as rows_to_copy 
WHERE 
    metabase_field_table.table_id IN (
     SELECT distinct(metabase_table.id) as ids 
     from metabase_table 
     LEFT JOIN metabase_database metabase_table_database ON metabase_table.db_id = metabase_table_database.id 
     where metabase_table_database.name = 'Dev' and metabase_table.active=1 and metabase_table.visibility_type is null 
    ) 
    and metabase_field_table.t_name = rows_to_copy.t_name 
    and metabase_field.name = rows_to_copy.name 

Это возвращает таблицу, глядя немного как это:

+-------------+-------------+--------------+--------------+ 
| description | description | display_name | display_name | 
+-------------+-------------+--------------+--------------+ 
| NULL  | to copy  | Application | Application | 

Не вдаваясь в углубляться в детали, я просто хотел скопировать результаты из rows_to_copy в поля метабазы_поля, что означает:

metabase_field.description = rows_to_co py.description, metabase_field.display_name = rows_to_copy.display_name

Я попытался просто изменить Выберите обновление:

UPDATE 
    metabase_field LEFT JOIN (select id as table_id, name as t_name from metabase_table) metabase_field_table ON metabase_field.table_id=metabase_field_table.table_id, 
    (
     SELECT metabase_field.name as name, metabase_field_table.t_name as t_name, metabase_field.display_name as display_name, metabase_field.description as description, metabase_field.special_type as type 
     FROM metabase_field 
     LEFT JOIN (select id as table_id, name as t_name, db_id, active, visibility_type from metabase_table) metabase_field_table ON metabase_field.table_id = metabase_field_table.table_id 
     LEFT JOIN metabase_database metabase_field_table_database ON metabase_field_table.db_id = metabase_field_table_database.id 
     where metabase_field_table.active=1 and metabase_field_table.visibility_type is null and metabase_field_table_database.name = 'Prod' 
    ) as rows_to_copy 
SET 
    metabase_field.description = rows_to_copy.description, 
    metabase_field.display_name = rows_to_copy.display_name 
WHERE 
    metabase_field_table.table_id IN (
     SELECT distinct(metabase_table.id) as ids 
     from metabase_table 
     LEFT JOIN metabase_database metabase_table_database ON metabase_table.db_id = metabase_table_database.id 
     where metabase_table_database.name = 'Dev' and metabase_table.active=1 and metabase_table.visibility_type is null 
    ) 
    and metabase_field_table.t_name = rows_to_copy.t_name 
    and metabase_field.name = rows_to_copy.name 
; 

Но этот запрос не кажется, что изменить что-либо - результаты остаются путь они были. Есть ли простой способ заставить его работать?

ответ

0
Update metabase_field set metabase_field.description= 
    rows_to_copy.description, metabase_field.display_name= 
    rows_to_copy.display_name LEFT JOIN (select id as table_id, name as 
    t_name from metabase_table) metabase_field_table ON 
metabase_field.table_id=metabase_field_table.table_id, (SELECT 
    metabase_field.name as name, metabase_field_table.t_name as t_name, 
    metabase_field.display_name as display_name,metabase_field.description as description, metabase_field.special_type 
as type FROM metabase_field LEFT JOIN (select id as table_id, name as 
    t_name, db_id, active, visibility_type from metabase_table) 
    metabase_field_table ON metabase_field.table_id = 
metabase_field_table.table_id LEFT JOIN metabase_database 
metabase_field_table_database ON metabase_field_table.db_id = 
    metabase_field_table_database.id where metabase_field_table.active=1 
    and metabase_field_table.visibility_type is null and 
    metabase_field_table_database.name = 'Prod') as rows_to_copy WHERE 
    metabase_field_table.table_id IN (SELECT distinct(metabase_table.id) 
    as ids from metabase_table LEFT JOIN metabase_database 
    metabase_table_database ON metabase_table.db_id = 
    metabase_table_database.id where metabase_table_database.name = 'Dev' 
    and metabase_table.active=1 and metabase_table.visibility_type is null 
    ) and metabase_field_table.t_name = rows_to_copy.t_name and 
    metabase_field.name = rows_to_copy.name 

Попробуйте

+0

Код без комментариев почти бесполезен. –

0

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

Я думаю, проблема в обновлении. В таблице обновлений должен быть псевдоним MF, и вы: SET MF.<field>

Если это не работает, удалите WHERE и посмотрите, есть ли у вас UPDATE. Конечно, только если вы можете провести тестирование на этих таблицах.

Если это не работает, начните с отдельной таблицы и добавьте одно соединение в каждый момент времени.

UPDATE metabase_field MF -- main alias for table to update. 
LEFT JOIN (SELECT id as table_id, name as t_name 
      FROM metabase_table) MT1 
    ON MF.table_id = MT1.table_id  
CROSS JOIN (SELECT MF1.name as name, 
        MT2.t_name as t_name, 
        MF1.display_name as display_name, 
        MF1.description as description, 
        MF1.special_type as type 
      FROM metabase_field MF1 
      LEFT JOIN (SELECT id as table_id, 
           name as t_name, 
           db_id, active, 
           visibility_type 
         from metabase_table) MT2 
       ON MF1.table_id = MT2.table_id 
      LEFT JOIN metabase_database MD 
       ON MT2.db_id = MD.id 
      WHERE MT2.active = 1 
       and MT2.visibility_type is null 
       and MD.name = 'Prod' 
    ) as rows_to_copy 
SET 
    MF.description = rows_to_copy.description, 
    MF.display_name = rows_to_copy.display_name 
WHERE 
    metabase_field_table.table_id IN (
     SELECT distinct(metabase_table.id) as ids 
     from metabase_table 
     LEFT JOIN metabase_database MB 
      ON MT2.db_id = MB.id 
     WHERE MB.name = 'Dev' 
      and MT2.active=1 
      and MT2.visibility_type is null 
    ) 
    and metabase_field_table.t_name = rows_to_copy.t_name 
    and metabase_field.name = rows_to_copy.name 
; 
+0

Кажется, ломается на 'Unknown column 'MT2.active' in 'where clause''. Должен ли я менять MT2 на MF1? EDIT: Changin также приводит к 'Unknown column 'MF1.active' in 'where clause'' – Niemand

+0

@Niemand Это всего лишь предложение. Поскольку я говорю, что запрос слишком велик, чтобы попытаться сделать редактирование здесь. Но надежда, которую вы можете видеть, более читаема, используя короткие различные псевдонимы, чем имена всех 'matebase_field' –

Смежные вопросы