Таблица обновлений Exasol с использованием подзапроса - PullRequest
0 голосов
/ 06 мая 2020

Я получил этот оператор, который работает в Oracle:

update table a set
a.attribute = 
    (select 
        round(sum(r.attribute1),4)
     from table2 p, table3 r
     where 1 = 1
     and some joins
    )                 
where 1 = 1
and a.attribute3 > 10 
;

Теперь я хотел бы сделать тот же оператор в Exasol DB. Но у меня возникла ошибка [Код: 0, SQL Состояние: 0A000] Функция не поддерживается: этот вид коррелированного подзапроса (Сессия: 1665921074538906818)

После некоторого исследования я обнаружил, что вам нужно написать запрос в следующий синтаксис:

UPDATE table a 
set a.attribute = r.attribute2
FROM table a, table2 p, table3 r
     where 1 = 1
     and some joins
     and a.attribute3 > 10; 

Проблема в том, что я не могу взять сумму r.attribute2. Так я получаю нестабильный набор строк. Есть ли способ сделать первый запрос в Exasol DB?

Спасибо за помощь, ребята!

1 Ответ

1 голос
/ 19 мая 2020

Следующий за SQL оператор UPDATE будет работать для случаев, если JOIN между table1 и table2 равны 1 к 1 (или если существует отношение 1 к 1 между целевой таблицей и набором результатов JOIN)

В этом случае столбец val целевой таблицы обновляется, в противном случае возвращается ошибка

UPDATE table1 AS a
    SET a.val = table2.val
FROM table1, table2
WHERE table1.id = table2.id;

С другой стороны, если объединение вызывает несколько возвратов для одной строки table1, возникает нестабильная ошибка.

Если вы хотите суммировать значения столбцов умножающихся строк, возможно, следующий подход может помочь

Сначала просуммируйте все строки таблицы2 в базах таблицы1 и используйте этот подвыбор как новую временную таблицу, затем используйте это в операторе UPDATE FROM

UPDATE table1 AS a
    SET a.val = table2.val
FROM table1
INNER JOIN (
    select id, sum(val) val from table2 group by id
) table2
    ON table1.id = table2.id;

Я пытался решить проблему, используя две таблицы. В вашем случае, вероятно, вы будете использовать table2 и table3 в операторе подзапроса

Надеюсь, это ответ вы искали

...