0

精简版:

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

让我们说:

A
---
 1 , 2 

B
--- 
 ? , 3 


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

使用表 CI 知道 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 的活动中。

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

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

4

2 回答 2

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 的了解。但是我认为以下方法会起作用:创建一个临时表,其中包含数据库 Arolein中每个activityin值的所有值。这个表本质上变成了一个活动表,除了现在你有替换activityid值的数字,可以查找以填写rolein数据库 B的缺失值。

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 中有唯一值,而数据库 A 中没有这些值activityin

最后:

DROP TEMPORARY TABLE db2.ttable;

为了完整起见。

于 2009-08-26T20:50:30.343 回答
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,您的问题帮助我更好地理解了自己的问题。

于 2009-08-26T23:38:26.137 回答