2015-08-12 6 views
3

Я пытаюсь обновить таблицу tr данными из ht. Оба имеют почти одинаковые столбцы. Итак, чтобы проверить, я выполнил этот запрос.postgres update with join

SELECT * FROM tr a 
RIGHT OUTER JOIN ht b 
USING (date, name, ft) 
WHERE ft IS NOT NULL 

дает 129 строк Проверить это было нормально, то я побежал как- запроса обновления>

UPDATE tr 
SET (o_t, g_v, br, s_t, st, c_d, n_r, n_a, cd_id) 
    = (a.o_t, a.g_v, a.br, a.s_t, a.st, a.c_d, a.n_r, a.n_a, 
    a.cd_id) 
FROM tr a 
RIGHT OUTER JOIN ht b 
USING (date, name, ft) 
WHERE a.ft IS NOT NULL 

запрос возвращал успешно: 4134 строк пострадавших

Может кто-нибудь на наставит меня, что пошло неправильно и как это сделать.

+0

У вас есть правое внешнее соединение на первом, левом внешнем соединении на втором. Это может иметь какое-то отношение к этому? –

+1

исправил sql. Проблема заключается только в этом: – user1572215

+0

. Более надежно просто вставлять код, который вы используете, в противном случае вы приглашаете все виды опечаток, которые выглядят как проблема, но не являются. –

ответ

0

Это немного сложно в Postgres. Однако я сомневаюсь в вашей логике. Казалось бы, что right outer join неверен, потому что вы проверяете, что первая таблица не NULL. Так что это будет показаться, чтобы захватить вашу логику:

UPDATE tr 
SET (o_t, g_v, br, s_t, st, c_d, n_r, n_a, cd_id) 
    = (a.o_t, a.g_v, a.br, a.s_t, a.st, a.c_d, a.n_r, a.n_a, 
    a.cd_id) 
FROM tr a JOIN 
    ht b 
    USING (date, name, ft); 

Предложение where даже излишним, потому что значение не может быть NULL из-за состояния join. В любом случае это не работает, но оно указывает на правильное решение.

В Postgres таблица в update не может быть в условии FROM, если только ваше намерение не является самостоятельным. Итак, попробуйте эту версию:

UPDATE tr 
SET (o_t, g_v, br, s_t, st, c_d, n_r, n_a, cd_id) 
    = (a.o_t, a.g_v, a.br, a.s_t, a.st, a.c_d, a.n_r, a.n_a, 
    a.cd_id) 
FROM tr a JOIN 
    ht b 
    USING (date, name, ft) 
WHERE tr.date = a.date and tr.name = a.name and tr.ft = a.ft; 

Однако это обновление не имеет смысла. Я подозреваю, что вы хотите, чтобы значения начинались с ht, NOTtr, когда есть совпадение. Если это так, это самый простой способ:

UPDATE tr 
    SET (o_t, g_v, br, s_t, st, c_d, n_r, n_a, cd_id) 
     = (a.o_t, a.g_v, a.br, a.s_t, a.st, a.c_d, a.n_r, a.n_a, 
     a.cd_id) 
    FROM ht a 
    WHERE tr.date = a.date and tr.name = a.name and tr.ft = a.ft;