2013-05-29 96 views
0

我试图从一个旧的数据库迁移到一个新的稍微不同的模式,并且我的SQL不是非常强大的一个数据。构建这个跨数据库查询

旧模式:有一张表我们称之为“Person”,其中一个字段可以有3个标志的排列组合。 Person表有一个外键给我们称为“标志”的另一个表。他们旗表有行对每个在一个字符串,这些标志的组合:

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”表中现在作为BIT字段的字段。

我想要做的是像一个:

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

然后我可以运行相应的7个不同的查询,更改ID和值。这个问题当然就是上面的SQL不正确。我想我需要某种JOIN ...或者where子句中的子查询或其他东西?

难以置信的前进方向。我的分手在这里想到的是,这不需要被压缩到一个单一的查询,或特别优雅。我希望运行这个查询一次,并完成它。

+1

打赌你想伤害谁曾经想出了。 @paul解决方案几乎是我在想的镜子。 –

回答

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的句法)

+0

+1 - 我也喜欢这个解决方案! – sgeddes

+0

是的,这工作像一个魅力。我没有想到在集合中使用case语句。完善。 – Raevik

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; 

如果在标志表中的标志值分别为列,你可以很容易地运行一个查询,但我理解它,它只是一个字符串字段。这是一个例子:

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