неявные внутренние объединения - равны ли они? - PullRequest
0 голосов
/ 26 сентября 2019

По моему мнению, эти два SELECT точно равны (но я хочу переписать первый для второго, чтобы помочь оптимизатору в моем случае) - какие бы данные ни находились в таблицах a, b, c, d, оба SELECT будут производить именноте же результаты.Вы согласны?Спасибо!

create table a (id number);
create table b (id number);
create table c (id number);
create table d (id number);

--Q1
select * from a,b,c,d
where a.id = b.id
and   a.id = c.id 
and   a.id = d.id;

--Q2
select * from a,b,c,d
where a.id = b.id
and   a.id = c.id 
and   a.id = d.id
      -- Q2 differs from Q1 only in the next 3 lines
and   b.id = c.id
and   b.id = d.id
and   c.id = d.id;

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Я собираюсь ответить на вопрос, являются ли эти неравенства всегда истинными.Ответ «нет», не в SQL.В большинстве случаев они эквивалентны.Проблема возникает с неявным преобразованием типов.

В частности, если a.id является числом, а другие столбцы являются строками, то возникает ситуация, в которой:

1 = '1'        -- true
1 = '1.00'     -- true
'1' = '1.00'   -- false

Вы можете увидеть это на этой дб <> скрипке.Было бы тривиально настроить это с помощью JOIN s, но, поскольку я не собираюсь писать код с запятыми в предложении FROM, я оставлю это упражнение вам.

На практикеИдентификаторы, используемые для объединений, должны быть одного типа.Вы даже не можете объявить отношения внешнего ключа, если это не так.Помимо этой передовой практики, эти два запроса не являются автоматически эквивалентными.

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

1 голос
/ 26 сентября 2019

Да, результаты будут точно такими же.Думать об этом алгебраически, если a = b и b = c, то a = c.Это означает, что последние три условия во втором запросе являются избыточными.

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

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