Stymied构建这个跨数据库查询

时间:2013-05-29 15:09:38

标签: mysql sql join sql-update

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

旧架构:有一个表我们称之为“Person”,其中一个字段可以包含3个标志的排列。 Person表有另一个表的外键,我们称之为“Flags”。它们的Flags表在String中包含每个标志组合的行:

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

新架构不需要此表(谢天谢地)。这些标志现在只是“人员”表中的字段,现在是BIT字段。

我想做的事情就像是:

UPDATE database2.Person SET (flag1, flag2, flag3) VALUES (true, false false) WHERE database1.Person.flag_id = 1;

然后我可以运行7个不同的查询,相应地更改ID和值。当然,问题在于上面的SQL不正确。我想我需要某种JOIN ......或者where子句中的子选择?

难倒前进的最佳方式。我的离别思想是,这不需要压缩成单个查询,或者特别优雅。我希望运行一次这个查询并完成它。

2 个答案:

答案 0 :(得分:2)

您可以尝试以下方式:

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语法编辑)

答案 1 :(得分:0)

如果我理解你的问题,这应该有效。它假设您在每个表中都有Person_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