分析来自不同数据库实例中相同表的数据

时间:2009-08-26 20:18:41

标签: sql oracle missing-data merging-data

简短版本:

如果两个列都有一个公共标识符,那么我如何映射表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

从第一次查询(来自taskperformance B)获取335的活动。

它出现在A的活动中。

但不是A中的任务表现(但相关活动:92,208,335,595)

结果中存在。相应的角色是:1

2 个答案:

答案 0 :(得分:1)

对于任何给定的activityin,似乎适用相同的rolein值。因此,如果数据库A(db1)对于rolein / activityin关系至少有一个关联,则可以使用简单的一次性更新查询填充数据库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中每个rolein值的所有activityin值。此表基本上成为活动表,除非您现在有数字替换{ {1}}值,可以查找以填充数据库B的activityid缺失值。

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          

如果数据库B中存在UPDATE db2.taskperformance SET db2.taskperformance.rolein = (SELECT db2.ttable.rolein FROM db2.ttable WHERE db2.taskperformance.activityin = db2.ttable.activityin); 中未在数据库A中出现的唯一值,则会出现此问题。

最后:

activityin

为了完整起见。

答案 1 :(得分:0)

最后我明白了。

似乎我没有开发出有助于进行查询的大脑部分。

这是结果

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,你的问题帮助我更好地理解了自己的问题。