T-SQL: разные результаты от self join-s

#sql-server #self-join

#sql-сервер #самосоединение

Вопрос:

Не могли бы вы мне помочь?
Почему два приведенных ниже кода возвращают разные результаты? Я новичок в SQL, и меня учили, что оба кода рассматриваются как самосоединения. Чего мне не хватает?
Требуемый результат — таблица с названиями стран и населением в процентах от населения Бангладеш.

 select a.name, 
       format(cast(a.population as float)/cast(b.population as float), 'p2') as percentage_from_Bangladesh
from bbc a, bbc b
where b.population = (select population from bbc where name = 'Bangladesh')  
 

и

 select a.name, 
       format(cast(a.population as float)/cast(b.population as float), 'p2') as percentage_from_Bangladesh
from bbc a join bbc b on a.name = b.name
where b.population = (select population from bbc where name = 'Bangladesh')
 

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

1. Поскольку первый запрос, использующий давно устаревший (начиная с SQL-92 в 1992 году) список, разделенный запятыми, в FROM стиле предложения, не определяет условие соединения ( on a.name = b.name часть во втором запросе) и, таким образом, вызывает декартово произведение между двумя объединенными таблицами….

2. Evolve — не используйте соединение в старом стиле через предложение where

Ответ №1:

В первом примере (устаревший синтаксис SQL) отсутствует предложение where для указания столбца, в котором нужно объединить две таблицы.

 select a.name, 
       format(cast(a.population as float)/cast(b.population as float), 'p2') as percentage_from_Bangladesh
from bbc a, bbc b
where a.name = b.name
and b.population = (select population from bbc where name = 'Bangladesh')