2016-11-30 85 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字段,这意味着要设置:

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

似乎打破'where clause'中'未知列'MT2.active'。我应该将MT2更改为MF1吗? 编辑:长宁也导致'未知列'MF1.active'在'子句' – Niemand

+0

@Niemand这只是一个建议。正如我所说的查询太大而无法在此处进行编辑。但希望你可以看到使用简短的别名比可以读取所有'matebase_field'更可读 –