【问题标题】:Analyzing data from same tables in different db instances分析来自不同数据库实例中相同表的数据
【发布时间】:2009-08-26 20:18:40
【问题描述】:

短版:

如果表 A 和 B 中的两列都有一个共同的标识符,而这两个列又可能在列 C 中有两个值,我该如何映射它们

让我们说:

A
---
 1 , 2 

B
--- 
 ? , 3 


C 
----- 
45, 2
45, 3

使用表 C 我知道 id 2 和 3 属于同一个项目( 45 ),因此“?”在表 B 中应该是 1。

什么查询可以做这样的事情?

编辑

省略了长版本。这真的很无聊/令人困惑

编辑

我在这里发布一些输出。

从这个查询:

select distinct( rolein) , activityin from taskperformance@dm_prod where activityin in ( 
    select activityin from activities@dm_prod where activityid in ( 
        select activityid from activities@dm_prod where activityin in ( 
            select distinct( activityin ) from taskperformance where rolein = 0 
        )
    )
)

我有以下部分:

select distinct( activityin ) from taskperformance where rolein = 0 

输出:

http://question1337216.pastebin.com/f5039557

    select activityin from activities@dm_prod where activityid in ( 
        select activityid from activities@dm_prod where activityin in ( 
            select distinct( activityin ) from taskperformance where rolein = 0 
        )
    )

输出:

http://question1337216.pastebin.com/f6cef9393

最后:

select distinct( rolein) , activityin from taskperformance@dm_prod where activityin in ( 
    select activityin from activities@dm_prod where activityid in ( 
        select activityid from activities@dm_prod where activityin in ( 
            select distinct( activityin ) from taskperformance where rolein = 0 
        )
    )
)

输出:

http://question1337216.pastebin.com/f346057bd

以来自第一个查询(来自任务性能 B)的 335 中的活动为例。

它存在于 A 的活动中。

但不是在taskperformance中A(而是a相关活动:92、208、335、595)

存在于结果中。中对应的作用是:1

【问题讨论】:

  • 您需要只运行一次此更新,还是在项目的整个生命周期内重复运行此更新?
  • 不,只有一次。对于以前的一些问题,我什至将输出打印到文件中,然后搜索和替换内容。就像从表中选择 columnA 然后复制/粘贴到文件中并搜索并将 s/number/insert 替换到表 $1 中,其中 value = $2 等...
  • 但是在这一点上我的头很痛,我无法想到“创造性”的选择。

标签: sql oracle missing-data merging-data


【解决方案1】:

对于任何给定的activityin,似乎都适用相同的rolein 值。因此,如果数据库 A (db1) 对于每个角色/活动关系至少有一个关联,您可以使用简单的一次性更新查询填充数据库 B (db2):

UPDATE db2.taskperformance
SET db2.taskperformance.rolein =
(SELECT db1.taskperformance.rolein
FROM db1.taskperformance
WHERE db1.taskperformance.activityin = db2.taskperformance.activityin);

我强烈建议在运行查询之前先备份数据库,因为它会更改所有 rolein 值,如果我的假设不正确,您可能有错误的数据。

编辑

虽然我认为它可以在一个查询中完成,但这超出了我对 sql 的了解。但是我认为以下方法会起作用:创建一个临时表,其中包含数据库 A 中每个 activityin 值的所有 rolein 值。该表本质上变成了一个活动表,除了现在您有替换 activityid 值的数字,可以通过查找来填补数据库B的rolein的缺失值。

CREATE TEMPORARY TABLE db2.ttable
SELECT db1.taskperformance.rolein, db1.activities.activityin
FROM db1.taskperformance, db1.activities
WHERE db1.taskperformance.activityin = db1.activities.activityin;

根据原始数据,得出:

rolein     activityin 
1          1          
1          2          
2          3          
2          4          
3          6          
3          7          
3          7          

现在您应该可以针对这个临时表运行更新查询了:

UPDATE db2.taskperformance
SET db2.taskperformance.rolein =
(SELECT db2.ttable.rolein
FROM db2.ttable
WHERE db2.taskperformance.activityin = db2.ttable.activityin);

问题在于,如果您在数据库 B 中具有 activityin 的唯一值,而这些值在数据库 A 中不存在。

最后:

DROP TEMPORARY TABLE db2.ttable;

为了完整起见。

【讨论】:

  • 确实,实际上我已经为所有在两个表 stackoverflow.com/questions/1331294/… 中匹配活动的记录更新了它。现在的问题是当它们在 taskperformace 中不直接匹配时(它们没有相同的 activtiyin ),但它们在活动中匹配。 (如 db1 中的 1,1 和 db2 中的 ?,2 和活动有 ( {"start",1 } {"start",2} ) :( :( :(
  • 哪个活动表与数据库 B 中的数据有正确的关联?或者更详细地说:两个数据库中的活动表是否相同?
  • 不,这就是问题所在。他们确实有相同的“标签”,但不同的 id(对于 75% 的情况......)没有.. 大约 90% 他们是相同的。丢失的 10% 是导致我在第一次迁移尝试中首先将角色空的原因。 :(
  • 顺便说一句 +1 支持:P(让我警告你会上瘾)
  • 谢谢。这是一个半复杂的问题,但我认为它可以很容易地解决。所以我的下一个(希望是最后一个)问题是:数据库 A 中的活动表能否用于填充数据库 B 中任务性能的所有角色值(忽略数据库 B 的活动表)?
【解决方案2】:

我终于明白了。

看来我只是没有开发出有助于查询的大脑部分。

这是结果

select distinct(  a.rolein ) , a.activityin, b.activityin 
from 
    taskperformance@dm_prod a,
    taskperformance b, 
    activities@dm_prod c,
    activities d
where b.rolein = 0
    and b.activityin = d.activityin 
    and d.activityid = c.activityid
    and c.activityin = a.activityin
order by b.activityin , a.activityin

感谢 JYelton,您的问题帮助我更好地理解了自己的问题。

【讨论】:

  • 很高兴我能提供帮助,我不确定我的最终建议是否会产生与您提出的相同的结果,但它是一个很好的思维导图。祝你好运。
猜你喜欢
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2014-08-29
  • 2020-11-03
  • 1970-01-01
相关资源
最近更新 更多