#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.