Как PostgreSQL интерпретирует эти два оператора соединения? - PullRequest
2 голосов
/ 16 июня 2019

У меня вопрос между двумя очень похожими операторами PostgreSQL:

  1. UPDATE classes SET year = 1
    FROM professors WHERE (professors.class = classes.class)
    AND professors.name = 'Smith'`
    

    Похоже, что это внутреннее соединение таблицы classes и таблицы professors и обновление только записи в classes, где имя соответствующего профессора - Смит.

  2. UPDATE classes c SET year = 1
    FROM classes cl JOIN professors on (professors.class_id = cl.class_id) 
    WHERE professors.name = 'Smith'`
    

    Это обновляет каждую запись в классах. Почему это утверждение отличается от первого?

1 Ответ

3 голосов
/ 16 июня 2019

Во втором вы ссылаетесь на classes дважды.Это две отдельные ссылки, и ссылки c и cl не коррелированы.На самом деле нет никаких условий для c, поэтому все строки обновляются.

Вы могли бы добавить условие корреляции:

UPDATE classes 
     SET year = 1
FROM classes cl JOIN
     professors p
     ON p.class_id = cl.class_id
WHERE p.name = 'Smith' AND cl.class_id = classes.class_id;

Однако JOIN не требуется, и первый запрос - лучший подход (для этой цели).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...