mysql - 将复杂的 MySQL 查询转换为 UPDATE 语句

标签 mysql sql

我有一个相当复杂的 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_copy.description, metabase_field.display_name = rows_to_copy.display_name

我尝试将 SELECT 更改为 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
;

但是这个查询似乎没有改变任何东西 - 结果保持原样。有什么简单的方法可以让它工作吗?

最佳答案

经过一些格式化后,我意识到跟踪表名称几乎是不可能的。使用更短且不同的别名以避免错误。我尝试改进其余的代码,但工作量太大

我认为问题出在更新上。更新表应该有别名 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
;

关于mysql - 将复杂的 MySQL 查询转换为 UPDATE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40890785/

相关文章:

php - 如何仅更新和设置当前时间的所有行

mysql - 获取范围之间的排名列表

java - 如何剪切字符串以适应 MySQL 中的文本字段

php - 无效参数和非法偏移量

mysql - 如何在子查询中使用 WHERE IN 和字符串列中的值?

c# - SQL Server/ASP.NET MVC 4 中 PK int 的大小

java - 结合 Java 和 SQL?

php - JOIN 3 个表中的行 WHERE table.column1 = tableS.column1 = tableT.column1

mysql - 如何应对 "your subquery return more than one row"

mysql - 使用外键进行双边行动