Является ли левое внешнее соединение эквивалентным внутреннему соединению для ненулевых внешних ключей? - PullRequest
0 голосов
/ 27 ноября 2018

Каждый город имеет страну-владельца:

create table COUNTRY 
(
     ID number not null,
     NAME varchar,
     primary key (ID)
);

create table CITY 
(
     ID number not null,
     NAME varchar,
     COUNTRY_ID number not null,
     primary key (ID)
);

alter table CITY 
    add constraint CITY_COUNTRY_FK
        foreign key (COUNTRY_ID) references COUNTRY (ID);

Является ли следующее:

select * 
from CITY c
left outer join COUNTRY ctr on ctr.ID = c.COUNTRY_ID
where ...;

эквивалентно:

select * 
from CITY c
inner join COUNTRY ctr on ctr.ID = c.COUNTRY_ID
where ...;

, поскольку COUNTRY_ID равен foreign key иnot null

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Да, в основном, если вы уверены, что все записи имеют эквивалент, во всех случаях левый будет эквивалентен внутреннему.

Как вы упомянули, у каждого города есть страна-владелец, так что да, это будет тот же результат

0 голосов
/ 27 ноября 2018

В этом случае left join является избыточным в зависимости от модели данных.Ограничение NOT NULL означает, что в каждом городе есть country_id.Ограничение внешнего ключа означает, что country_id допустимы и находятся в таблице country.

В сочетании эти ограничения говорят, что каждая строка в city имеет соответствующую строку в country.Когда все ключи совпадают, left join эквивалентно inner join.

...