2016-09-24 100 views
0

我有兩個表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

@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。因爲我通過CreatedByCreatedAt列創建的幾乎所有表格,NATURAL JOIN根本不適用於我的表格。

我還認爲,當連接鍵沒有明確指定時,它會更難調試代碼 - 因爲它們是USINGON

+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