2013-05-29 97 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