我有一个相当复杂的 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/