2016-11-30 32 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'更可讀 –