соединение без объединения в PostgresSQL

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть код со следующим psql запросом, который я пытаюсь понять (он был упрощен для вопроса):

 select id, time, t.type, t.sub_type from TABLE_A r,TABLE_B t,TABLE_C l where r.type = t.type and t.type = l.type
  

Это то же самое, что и выполнение соединения, или я что-то здесь упускаю?

Комментарии:

1. Это архаичный способ написания a JOIN и его следует заменить.

2. Пожалуйста, используйте современный JOIN синтаксис, а не старый синтаксис 1989 года (год ламбады).

Ответ №1:

Вы выполняете неявное соединение старой школы. Это синтаксис, используемый до стандарта SQL ANSI-92, который начал рекомендовать явные соединения, подобные этой версии вашего запроса:

 select id, time, t.type, t.sub_type    -- but please always use aliases here
from TABLE_A r
inner join TABLE_B t
    on r.type = t.type
inner join TABLE_C l
    on t.type = l.type;
  

Приведенная выше версия считается «правильным» способом выражения вашей логики. Явные соединения решили ряд проблем, присущих неявным соединениям. Неявные соединения помещают как логику соединения, так и критерии фильтрации в одно и то же WHERE предложение, что потенциально затрудняет понимание того, что там происходит. Кроме того, было сложнее выразить левое / правое / внутреннее / перекрестное соединение, используя неявный синтаксис, поскольку разные поставщики иногда имеют разный синтаксис. На данный момент явное соединение ANSI-92 практически одинаково для всех основных поставщиков SQL.