Hm.Все в порядке, но я думаю, что он у меня есть.
В своем первом запросе вы полностью присоединяете таблицу к себе по ключу ANOTHER_ID.
Когда две соединенные таблицы являютсяТо же самое, не имеет значения, выполняете ли вы полное соединение, внутреннее соединение, левое соединение или правое соединение: результат одинаков.Потому что ваш ключ ANOTHER_ID всегда либо существует, либо не существует в обеих таблицах.Нет случаев, в которых одна таблица имеет значение для ANOTHER_ID, которое не найдено в другой таблице, и, как таковые, нет случаев, когда либо TAB1.ANOTHER_ID, либо TAB2.ANOTHER_ID заканчивалось бы значением NULL.Так что вы на самом деле просто выполняете само-внутреннее соединение с ANOTHER_ID.
Теперь я не знаю содержимого вашего столбца ID, но я думаю, что он всегда заполнен каким-то значением.Так что после вашего само-внутреннего объединения, столбцы результирующего идентификатора всегда будут заполнены чем-то.Возможно, не 6 или 8, но также и не NULL.При отсутствии значений NULL ваш запрос WHERE преобразуется в WHERE TAB1.ID = 6 AND TAB2.ID = 8
, что оставляет только правильные комбинации и ничего больше.
Напротив, во втором запросе вы определяете подмножества ID = 6 и ID =8 и полное соединение этих подмножеств друг с другом.Подмножество 1 содержит определенные вхождения ANOTHER_ID, которого нет в подмножестве 2, и наоборот.Так что теперь есть основание для FULL JOIN, потому что некоторые строки не будут соединены с другими строками, оставляя значения NULL в TAB1.ID или TAB2.ID, которые вы можете обнаружить.
Я думаю, ваш первый запрос может быть скорректированизменив предложение WHERE на: WHERE TAB1.ID IN (6,8) AND TAB2.ID IN (6,8)
.Это, однако, даст другой результат, как ваш второй запрос, и я думаю, что также определенное количество повторяющихся строк.И я тоже не думаю, что это будет быстрее.