【问题标题】:Stymied building this cross-database query阻碍构建此跨数据库查询
【发布时间】:2013-05-24 22:23:03
【问题描述】:

我正在尝试将一些数据从旧数据库迁移到架构略有不同的新数据库,但我的 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”表中的字段,作为 BIT 字段。

我想做的是:

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

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

对最佳前进方向感到困惑。我在这里的分离想法是,这不需要压缩到单个查询中,或者特别优雅。我希望运行一次此查询并完成它。

【问题讨论】:

  • 打赌你想伤害想出这个的人。 @paul 解决方案几乎反映了我的想法。

标签: mysql sql join sql-update


【解决方案1】:

你可以试试这样的:

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

【讨论】:

  • 是的,这就像一个魅力。我不认为在集合中使用 case 语句。完美。
【解决方案2】:

如果我理解您的问题,这应该可以工作。它假定您在每个表中都有一个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 2021-12-05
    • 2021-08-26
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2010-12-21
    相关资源
    最近更新 更多