Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 无法生成此跨数据库查询_Mysql_Sql_Join_Sql Update - Fatal编程技术网

Mysql 无法生成此跨数据库查询

Mysql 无法生成此跨数据库查询,mysql,sql,join,sql-update,Mysql,Sql,Join,Sql Update,我正在尝试将一些数据从一个旧数据库迁移到一个架构稍有不同的新数据库,而我的SQL不是非常强大 旧模式:有一个表,我们称之为“Person”,其中的字段可以有一组3个标志的排列。Person表有一个外键指向另一个表,我们称之为“Flags”。它们标志表中的每一个标志组合的行都是字符串: 1 - Yes No No 2 - Yes Yes No 3 - Yes No Yes 4 - Yes Yes Yes 5 - No Yes No 6 - No Yes Yes 7 - No No Yes 新的模

我正在尝试将一些数据从一个旧数据库迁移到一个架构稍有不同的新数据库,而我的SQL不是非常强大

旧模式:有一个表,我们称之为“Person”,其中的字段可以有一组3个标志的排列。Person表有一个外键指向另一个表,我们称之为“Flags”。它们标志表中的每一个标志组合的行都是字符串:

1 - Yes No No
2 - Yes Yes No
3 - Yes No Yes
4 - Yes Yes Yes
5 - No Yes No
6 - No Yes Yes
7 - No No Yes
新的模式不需要这个表(谢天谢地)。这些标志现在只是“Person”表中的字段,作为位字段

我想做的是:

UPDATE database2.Person SET (flag1, flag2, flag3) VALUES (true, false false) WHERE database1.Person.flag_id = 1;
然后,我可以运行7个不同的查询,相应地更改ID和值。当然,问题是上面的SQL不是正确的。我想我需要某种形式的连接…或者where子句中的子选择还是什么


在前进的最佳道路上举步维艰。我的临别赠言是,这不需要压缩成单个查询,也不需要特别优雅。我希望运行此查询一次并完成它。

您可以尝试以下操作:

update database2.Person p2 join database1.Person p1 on p1.PersonId = p2.PersonId
set    flag1 = case when p1.Flag_id in (1,2,3,4) then true else false end case,
       flag2 = case when p1.Flag_id in (2,4,5,6) then true else false end case,
       flag3 = case when p1.Flag_id in (3,4,6,7) then true else false end case

(为mySQl语法编辑)

如果我理解你的问题,这应该可以。它假设您在每个表中都有一个匹配的
Person\u Id

UPDATE db2.Person p
    JOIN db1.Person p2 ON p.Person_Id = p2.Person_Id
SET p.Flag1 = 1, 
    p.Flag2 = 0, 
    p.Flag3 = 0
WHERE p2.Flag_Id = 1;

如果Flags表中的标志值是列,则可以轻松运行单个查询,但据我所知,它只是一个字符串字段。这是一个例子:

UPDATE db2.Person p
    JOIN db1.Person p2 ON p.Person_Id = p2.Person_Id
    JOIN db1.Flags f ON p2.Flag_Id = f.Flag_Id
SET p.Flag1 = CASE WHEN f.Flag1 = 'Yes' THEN 1 ELSE 0 END,
    p.Flag2 = CASE WHEN f.Flag2 = 'Yes' THEN 1 ELSE 0 END,
    p.Flag3 = CASE WHEN f.Flag3 = 'Yes' THEN 1 ELSE 0 END

我打赌你一定想伤害想出这个主意的人@保罗的解决方案几乎反映了我的想法。是的,这很有魅力。我不认为在集合中使用case语句。完美的