2016-09-24 3 views
0

У меня есть две таблицы ДЕЯТЕЛЬНОСТЬ И ПРОИЗВОДИТЕЛЬНЫЕ, определяемые следующим образом.Выбор отношения один к одному

CREATE TABLE Activities (
ActivityID int NOT NULL, 
ActivityName char(30) NOT NULL default 'charity', 
PRIMARY KEY (ActivityID) 
); 



CREATE TABLE Performers (
    PerformerID int NOT NULL default '0', 
    PerformerName char(20) NOT NULL default '', 
    Street char(20) NOT NULL default '', 
    City char(15) NOT NULL default '', 
    State char(2) NOT NULL default '', 
    Zip int NOT NULL default '0', 
    ActivityID int default '0', 
    PRIMARY KEY (PerformerID), 
    FOREIGN KEY(ActivityID) REFERENCES Activities(ActivityID) ON DELETE NO ACTION ON UPDATE NO ACTION); 

У каждого исполнителя есть определенное действие. Как выбрать имя исполнителя вместе с тем действием, которое они выполняют?

Я попытался

SELECT performername,activityname FROM PERFORMERS NATURAL JOIN ACTIVITIES; 

Это кажется правильным. Будет ли это всегда?

+0

@samurdhilibk Будут случаи, когда естественное соединение не будет работать, или естественное соединение не требуется. –

ответ

1

Не используйте NATURAL JOIN. Это ошибка, ожидающая своего появления. Рекомендация для INNER JOIN хороша. Вот два способа:

select p.performername, a.activityname 
from Performers p inner join 
    Activities a 
    on a.ActivityID = p.ActivityID; 

Или:

select p.performername, a.activityname 
from Performers p inner join 
    Activities a 
    using (ActivityID); 

В чем проблема с NATURAL JOIN? По сути, проблема в том, что он идентифицирует общие ключи просто по их именам. Он не признает заявленным отношением внешних ключей между двумя таблицами. Он использует только столбцы с тем же именем.

Это ухудшается, потому что у вас могут быть дополнительные столбцы, которые имеют одно и то же имя. Например, в обеих таблицах вы можете вызвать вызываемый name. Это будет автоматически будет использоваться для NATURAL JOIN. Потому что почти все таблицы, которые я создаю на CreatedBy и CreatedAt столбцах, NATURAL JOIN просто не будут работать на моих таблицах.

Я также думаю, что это делает намного сложнее отлаживать код, когда ключи соединения не указаны явно - как они есть либо с USING, либо ON.

+0

Спасибо @ Gordon! Второй вариант работает только из-за объявления внешнего ключа, правильно? – samurdhilbk

+0

@samurdhilbk. , , Нет. Нет возможности автоматически использовать объявление внешнего ключа для 'join', увы. Оба работают, потому что ключи явно указаны. Предложение 'using' работает, потому что ключ имеет одно и то же имя в обеих таблицах. –

2

Вы можете использовать внутреннее соединение

select a.performername, b.activityname 
from Performers as a 
inner join Activities as b on a.ActivityID = b.ActivityID 
Смежные вопросы