2012-12-11 30 views
1

我工作的SQL現在一些提示和我有這些表:需要有關SQL

CREATE TABLE Gym (
eid INT PRIMARY KEY, 
name VARCHAR(127) UNIQUE, 
district VARCHAR(127), 
area INT); 

CREATE TABLE Trainer (
id INT PRIMARY KEY, 
name VARCHAR(127), 
birth_year INT, 
year_credentials_expiry INT 
); 

CREATE TABLE Works (
eid INT, 
id INT, 
since INT, 
FOREIGN KEY (eid) REFERENCES Gym (eid), 
FOREIGN KEY (id) REFERENCES Trainer (id), 
PRIMARY KEY (eid,id)); 

我想建立一個查詢,能告訴我健身房的名字與區「卡薩諾瓦',至少在那裏有一名教練工作。

我一直在想使用EXISTS操作符,但必須有一個更簡單的方法。 CAn有人幫助我嗎?

+2

由於您要求提示而不是答案,因此提示將使用「內部聯接」。內部連接'表1'到'表2'將導致僅返回'表2'具有與'表1'相關的記錄的記錄。 – Khan

回答

0

簡單INNER JOINWorks之間Gym表就可以了:

SELECT DISTINCT g.* 
FROM 
    Gym g 
    JOIN Works w 
    ON g.eid = w.eid 
WHERE 
    g.district = 'Casanova' 

如果沒有至少一個教練在健身房工作,這個查詢將返回什麼。

+0

您可以獲得健身房記錄的複數 – RichardTheKiwi

+0

啊!感謝@RichardTheKiwi,增加了「DISTINCT」來刪除重複項。 – Vikdor

+0

謝謝,那是爲我做的! –

0

作爲參考,EXISTS查詢:

select * 
    from Gym g 
where district = 'Casanova' 
    and exists (select * 
       from Works w 
       where w.eid = g.eid); 

爲什麼你認爲應該有一個 「簡單」 的方法?
另一種方法是在三維連接中列出健身房表中的所有列,這隻有在有訓練師參加時纔會有效。

select distinct g.eid, g.name, g.district, g.area 
    from Gym g 
    join Works w on w.eid = g.eid 
where g.district = 'Casanova'; 

但考慮到你需要使用DISTINCT從健身房表中獲取列,我幾乎感覺不到它的「簡單」。你是法官。