ОБНОВЛЕНИЕ с СОЕДИНЕНИЕМ и условием SQL - PullRequest
0 голосов
/ 30 марта 2020

У меня есть 2 таблицы, и я пытаюсь обновить один из столбцов в одном из них, используя данные из второго. У меня есть SQL:

UPDATE 
        table_one
SET 
        contents = CONCAT('https://someurl.com/', table_one.id, '.', split_part(T2.file_name, '.', 2))  
FROM 
        table_one T1
JOIN 
        table_two T2
ON 
        T1.id = T2.image_id
WHERE   
        T1.kind IN ('image')

Я пытаюсь взять значение file_name столбца таблицы table_two и вставить его в столбец contents table_one для данного идентификатора и для вида 'image', который является столбцом table_1. Таким образом, обновление должно происходить только для записей с kind = 'image'. Часть split и concat выполняется для получения расширения файла.

Это работает, но обновляет все записи, не принимая во внимание вид, который установлен как «изображение». Также кажется, что он получает все одинаковые значения, потому что все расширения установлены одинаково.

Может кто-нибудь указать на то, что я делаю неправильно, пожалуйста?

Обновление: Я использую Postgres.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Как указано в руководстве , не повторяйте таблицу назначения в предложении FROM:

UPDATE table_one t1
  SET contents = CONCAT('https://someurl.com/', table_one.id, '.', split_part(T2.file_name, '.', 2))  
FROM table_two T2
WHERE T1.id = T2.image_id
  AND T1.kind IN ('image')
0 голосов
/ 30 марта 2020

Вы присоединили table_one к себе, без каких-либо условий для объединения. Поэтому у вас есть декартово соединение, и каждый ряд обновляется. T1.kind IN ('image') не имеет значения, поскольку вы не обновляете T1, вы обновляете table_one.

Обратите внимание на предупреждение :

Обратите внимание, что таблица назначения не должно появляться в from_list, если только вы не намереваетесь самостоятельно объединиться (в этом случае оно должно появиться с псевдонимом в списке_файлов).

Просто переписать без объединения с T1. Вы должны переместить условие соединения с ON на WHERE, поскольку нет возможности использовать ON с неявным соединением.

UPDATE 
        table_one
SET 
        contents = CONCAT('https://someurl.com/', table_one.id, '.', split_part(T2.file_name, '.', 2))  
FROM 
        table_two T2
WHERE   
        table_one.kind IN ('image') and table_one.id=t2.image_id
...