Анализ данных из одних и тех же таблиц в разных экземплярах БД - PullRequest
0 голосов
/ 27 августа 2009

Короткая версия:

Как можно сопоставить два столбца из таблицы A и B, если они оба имеют общий идентификатор, который в свою очередь может иметь два значения в столбце C

Позволяет сказать:

A
---
 1 , 2 

B
--- 
 ? , 3 


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

Используя таблицу C, я знаю, что id 2 и 3 принадлежат одному и тому же элементу (45) и, следовательно, "?" в таблице B должно быть 1.

Какой запрос может сделать что-то подобное?

РЕДАКТИРОВАТЬ

Длинная версия опущена. Это было действительно скучно / запутанно

EDIT

Я публикую здесь некоторые результаты.

Из этого запроса:

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

Возьмем, например, активность в 335 из первого запроса (из выполнения задачи B).

Присутствует в деятельности от А.

Но не в исполнении заданий в A (а в связанных с этим действиях: 92, 208, 335, 595)

Присутствуют в результате. Соответствующая роль в: 1

Ответы [ 2 ]

1 голос
/ 27 августа 2009

Кажется, что для любого данного 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, и, если мое предположение неверно, у вас могут быть неверные данные.

EDIT

Хотя я думаю, что это можно сделать одним запросом, я не знаю, что такое sql. Однако я думаю, что сработает следующее: создайте временную таблицу, которая содержит все значения rolein для каждого значения activityin в базе данных A. Эта таблица по сути становится таблицей действий, за исключением того, что теперь у вас есть числа, заменяющие значения 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 для activityin, которых нет в базе данных A.

Наконец:

DROP TEMPORARY TABLE db2.ttable;

Ради полноты.

0 голосов
/ 27 августа 2009

Наконец-то я понял.

Похоже, я просто не разработал участок мозга, который помогает делать запросы.

Вот результат

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

Спасибо, Йелтон, ваши вопросы помогли мне лучше понять мой собственный вопрос.

...