0

短縮版:

テーブルAとBの両方に共通の識別子があり、列Cに2つの値がある場合、テーブルAとBの2つの列をマップするにはどうすればよいですか。

まあ言ってみれば:

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のタスクパフォ​​ーマンスには含まれていません(ただし、関連するアクティビティ:92、208、335、595)

結果に存在します。の対応する役割は次のとおりです:1

4

2 に答える 2

1

どの与えられたものに対してもactivityin、同じrolein値が適用されるようです。したがって、データベースA(db1)にrolein / activityin関係ごとに少なくとも1つの関連付けがある場合は、データベースB(db2)に単純な1回限りの更新クエリを設定できます。

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

すべての値が変更されるため、クエリを実行する前に最初にデータベースをバックアップすることを強くお勧めしますrolein。私の仮定が正しくない場合は、データが不良である可能性があります。

編集

1つのクエリで実行できると思いますが、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);

activityinこれに伴う問題は、データベースAに発生しない一意の値がデータベースBにある場合です。

ついに:

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 に答える