任何人都可以解释我如何连接这些表吗? 我必须能够列出一个国家的人口,列出一个城市的人口,并列出公司中每个城市的员工人数!唯一的限制是城市名称是唯一的,公司只能在一个城市出现一次,但在一个国家可以有多个分支。
我制作了国家/地区,公司和城市表,但我无法理解如何正确连接它们并获得此功能。我观看了一些youtube教程并阅读了很多帖子,但我似乎仍然无法使其工作。如果有人可以提供帮助,我会很感激。非常感谢你们!
答案 0 :(得分:0)
列表中缺少的一个实体是branch
(公司的)。表定义是:
CREATE TABLE country (
id integer NOT NULL PRIMARY KEY,
name varchar NOT NULL,
population integer NOT NULL
);
CREATE TABLE city (
id integer NOT NULL PRIMARY KEY,
name varchar NOT NULL,
population integer NOT NULL,
country integer NOT NULL REFERENCES country(id)
);
简单。您有一个国家/地区列表和一系列城市。城市记录有一列country
,它引用country
表中的正确记录。城市名称未设置UNIQUE
,因为不同的国家/地区可以使用相同名称的城市(英语,荷兰语,葡萄牙语和西班牙语帝国创建了具有旧名称的新城市,这些城市有时可以区分(纽约)但并非总是如此(例如作为墨尔本))。如果您确实希望城市名称是唯一的,请将UNIQUE
子句附加到name
列。
CREATE TABLE company (
id integer NOT NULL PRIMARY KEY,
name varchar NOT NULL
);
CREATE TABLE branch (
company integer NOT NULL REFERENCES company(id),
city integer NOT NULL REFERENCES city(id),
name varchar,
employees integer NOT NULL,
PRIMARY KEY (company, city)
);
这里的诀窍是公司分支机构的PK是根据公司标识符和城市标识符组合定义的。 PK在表中始终是唯一的。
假设您在单个查询中需要人口计数和员工,这可以解决问题:
SELECT
company.name AS company,
branch.name AS branch,
city.name AS city,
branch.employees,
city.population AS city_pop,
country.population AS country_pop
FROM company
JOIN branch ON branch.company = company.id
JOIN city ON city.id = branch.city
JOIN country ON country.id = city.country
ORDER BY company.name, branch.name;