2016-10-31 3 views
0

Vertica имеет интересный синтаксис обновления при обновлении таблицы на основе значения соединения. Вместо того, чтобы использовать соединение, чтобы найти строки обновления, он предписывает синтаксис вроде этого:Какое соединение используется в инструкции Vertica UPDATE?

UPDATE a 
SET col = b.val 
where a.id = b.id 

(Обратите внимание, что этот синтаксис действительно предусмотрен в этом случае, потому что Vertica запрещает нам использовать где положение, что включает в себя " self-join ", то есть соединение, ссылающееся на обновляемую таблицу, в данном случае a.)

Этот синтаксис хорош, но он менее явственен о том, что соединение используется, чем другие диалекты SQL. Например, что происходит в этом случае?

UPDATE a 
SET col = CASE 0 if b.id IS NULL ELSE b.val END 
where a.id = b.id 

Что происходит, когда a.id не имеет аналогов в b.id? a.col не обновляется, как будто условие a.id = b.id представлено внутренним соединением a и b? Или он обновляется до нуля, как если бы это было левое внешнее соединение?

+0

что 'b' в запросе? –

ответ

2

Я думаю, что Vertica использует стандарт Postgres для этого синтаксиса:

UPDATE a 
    SET col = b.val 
    FROM b 
    whERE a.id = b.id; 

Это INNER JOIN. Я согласен с тем, что было бы неплохо, если Postgres и производные базы данных поддерживали явное значение JOIN s в таблице обновлений (как это делают некоторые другие базы данных). Но ответ на ваш вопрос заключается в том, что это INNER JOIN.

Следует отметить, что если вы хотите LEFT JOIN, у вас есть два варианта. Одним из них является коррелированных подзапросов:

UPDATE a 
    SET col = (SELECT b.val FROM b whERE a.id = b.id); 

Другой дополнительный уровень JOIN (при условии, что id является уникальным в a):

UPDATE a 
    SET col = b.val 
    FROM a a2 LEFT JOIN 
     b 
     ON a2.id = b.id 
    WHERE a.id = a2.id; 
+0

Выполняет ли какое-либо из этих решений правило ["no self-join"] (https://my.vertica.com/docs/8.0.x/HTML/Content/Authoring/SQLReferenceManual/Statements/UPDATE.htm) ? Я бы предположил, что первое решение в порядке, а второе - нет? – Paul

+0

Я знаю, что я мог бы просто попробовать это и посмотреть, что позволяет Vertica, но у меня были плохие впечатления, когда Vertica терпела неудачу и произвела мусорные результаты по этому типу запросов на самообвинение. – Paul

+0

@Paul. , , Ну, последний запрос явно нарушает это правило. Я не знаю, разрешает ли Vertica коррелированные подзапросы в 'UPDATE'. Этот ответ основан на синтаксическом сходстве с Postgres, и все три запроса должны работать в Postgres. –