【问题标题】:Need some hints about SQL需要一些关于 SQL 的提示
【发布时间】:2012-12-11 02:10:35
【问题描述】:

我现在正在处理 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));

我想构建一个查询,它可以告诉我带有“Casanova”区的健身房的名称,至少那里有一名教练在工作。

我一直在考虑使用 EXISTS 运算符,但必须有更简单的方法。 有人可以帮我吗?

【问题讨论】:

  • 由于您要的是提示而不是答案,因此提示是使用inner join。将table 1 内部连接到table 2 将导致仅返回table 2 具有与table 1 相关的记录的记录。

标签: sql select exists


【解决方案1】:

GymWorks 之间的简单 INNER JOIN 表就可以了:

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

如果该健身房中没有至少一名培训师在工作,则此查询将不返回任何内容。

【讨论】:

  • 你可以得到 Gym 记录的倍数
  • 啊!感谢@RichardTheKiwi,添加了DISTINCT 以删除重复项。
  • 谢谢你,为我做的!
【解决方案2】:

作为参考,EXISTS 查询:

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

您为什么认为应该有一种“更简单”的方法?
另一种方法是在三向联接中列出 Gym 表中的所有列,这仅在有要加入的教练时才有效。

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 从 Gym 表中获取列,我几乎不觉得它“更简单”。你是法官。

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多