2016-11-30 61 views
0

を更新するために、複雑なMySQLのクエリの変換:私は非常に複雑MySQLのクエリを持っているの文

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私はちょうど更新するために、SELECTを変更しようとしました

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 

テーブル名のほとんどIMPOSIBLEキープトラックならば、私はいくつかの実現整形した後、この

+0

コメントなしのコードはほとんど役に立たない。 –

0

を試してみてください。バグを避けるために、より短い別名を使用してください。私はコードの残りの部分を改善しようとするが、あまりにも多くの作業をする

私は問題がアップデートだと思う。更新テーブルに別名MFが必要です。SET MF.<field>

その場合、WHEREを削除し、UPDATEかどうかを確認してください。もちろん、あなたはそれらのテーブルでテストを行うことができます。

それが機能しない場合は、1つのテーブルから始め、毎回1つの結合を追加してください。

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句'の '不明な列' MT2.active 'に違反しているようです。 MT2をMF1に変更する必要がありますか? 編集:Changinも 'Unknown column 'MF1.active' where where句 'になります。 – Niemand

+0

@Niemandこれは単なる提案に過ぎません。私が言っているように、ここで編集をしようとするにはクエリが大きすぎます。しかし、あなたが見ることができることを願っています。名前のすべてよりも短い別名を使って読みやすくなります。 'matebase_field' –

関連する問題