#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')