我有两个表ACTIVITIES和PERFORMERS以下列方式定义。
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 :(得分:2)
您可以使用内部联接
select a.performername, b.activityname
from Performers as a
inner join Activities as b on a.ActivityID = b.ActivityID
答案 1 :(得分: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
一样。