2016-11-30 3 views
0

Ich habe eine ziemlich komplexe Mysql Abfrage UPDATE:Konvertierung komplexer MySQL-Abfrage-Anweisung

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 

Dieses eine Tabelle ein bisschen so aussieht zurück:

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

Ohne zu tief in die Details, ich wollte nur Ergebnisse von rows_to_copy copty Felder metabase_field, was zu setzen bedeutet:

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

Ich habe gerade versucht SELECT ändern UPDATE:

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 
; 

Aber diese Abfrage scheint nicht, etwas zu ändern - die Ergebnisse bleiben die Art und Weise Sie sind. Gibt es einen einfachen Weg, um es zum Laufen zu bringen? wenn fast imposible Auge behalten Tabellennamen

Antwort

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 

Versuchen Sie, diese

+0

Code ohne Kommentar sind fast nutzlos. –

0

Nach einiger Formatierung ich realisieren. Verwenden Sie kürzere und andere Alias, um Fehler zu vermeiden. Ich versuche, den Rest des Codes zu verbessern, aber zu viel Arbeit

Ich denke, das Problem ist das Update. Update-Tabelle sollte den Alias ​​MF haben, und Sie SET MF.<field>

Wenn das nicht funktioniert, entfernen Sie die WHERE und sehen Sie, ob Sie etwas UPDATE. Natürlich nur, wenn Sie Tests an diesen Tabellen durchführen können.

Wenn das nicht funktioniert, beginnen Sie mit einer einzelnen Tabelle und fügen Sie jeweils eine Verknüpfung hinzu.

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

Scheint zu brechen "Unbekannte Spalte" MT2.active "in" Where-Klausel ". Sollte ich MT2 zu MF1 wechseln? EDIT: Changin führt auch zu 'Unbekannte Spalte' MF1.active 'in' where clause'' – Niemand

+0

@Niemand Dies ist nur ein Vorschlag. Wie ich sage, ist die Abfrage zu groß, um hier den Schnitt zu machen. Aber ich hoffe, Sie können sehen, ist lesbar mit kurzen anderen Alias ​​als alles "matebase_field" nennen –