Существуют три таблицы A, B и C, в которых мне нужно добавить или объединить значения из C на основе формулы, представленной в B, в A - PullRequest
0 голосов
/ 08 июня 2018

У меня есть 3 таблицы A, B и C. Мне нужно вставить значения в таблицу A, которые доступны в таблице C, на основе формулы, представленной в таблице B.

Пример:

Таблица A::

Person loc  Address
--------------------
abc    usa  NULL
def    uk   NULL 

Tableb ::

loc formula
--------------------
usa a1+a2+a3
uk  a1+a3

Tablec ::

person  a1        a2     a3
----------------------------------------
abc    dadad    sadada  dadada
def    fkjfkans         kjdvbnskdnb
execute immediate '
 SELECT 
a.person,
'b.'||replace(formula,'+','||b.') as new_Add,
c.loc,c.a1,c.a2,c.a3
from TableA a,
    TableC c,
    TableB b
WHERE 
a.person = c.Person
and a.loc = b.loc;';

Я знаю, что мой запрос не завершен, но я хотел бызнать, работает ли этот подход?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Это действительно плохой дизайн базы данных, и тот, кто придумал его (если это не вы), должен поговорить со мной.Вы уже видели, как кошмарно было иметь дело с цитатами в вашем запросе.Более того, программы, написанные на динамическом SQL, всегда сложно отлаживать и поддерживать.Я бы порекомендовал вам сменить модель, если это возможно.Помните об этом всякий раз, когда вы используете этот код.

DECLARE
    v_addr   VARCHAR2(1000);
BEGIN
    FOR rec IN (
        SELECT
            a.person,
            a.loc,
            replace(formula,'+','||') AS true_formula
        FROM
            tablea a
            JOIN tableb b ON a.loc = b.loc
            JOIN tablec c ON a.person = c.person
    ) LOOP
        EXECUTE IMMEDIATE 'SELECT '
                          || rec.true_formula
                          || ' FROM Tablec   WHERE person = :b_person'
        INTO v_addr
            USING rec.person;
        EXECUTE IMMEDIATE 'UPDATE tablea
         SET
            address =:b_addr
         WHERE
         person =:b_person
            AND loc =:b_loc'
            USING v_addr,rec.person,rec.loc;
    END LOOP;
END;
/

Демо

0 голосов
/ 08 июня 2018

Если у вас есть похожая модель (условия ограничены a1, a2 и a3), вы можете использовать приведенный ниже запрос, чтобы сгенерировать тип данных, которые вам нужны для таблицы B:

select a.loc,
trim(trailing '+' from (
trim(trailing from (
case when c.a1 IS NOT NULL
    THEN 'a1 + '
    end || 
case when c.a2 IS NOT NULL
    THEN 'a2 + '
    end || 
case when c.a3 IS NOT NULL
    THEN 'a3'
    end   ))))
from A a, C c where a.person = c.person;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...