查询公司和地区

时间:2018-11-16 12:31:31

标签: sql database postgresql

我现在正在做一些有关SQL的练习。

我有一个具有以下架构的数据库:

CREATE TABLE regions(
region_id          INTEGER PRIMARY KEY,
region_name        TEXT NOT NULL,
number_of_customers INTEGER NOT NULL);

CREATE TABLE region_borders (
region_id1 INTEGER REFERENCES regions,
region_id2 INTEGER REFERENCES regions,
PRIMARY KEY (region_id1, region_id2));

CREATE TABLE companies (
company_id                  INTEGER PRIMARY KEY,
company_name                TEXT NOT NULL,
headquarters_region     INTEGER REFERENCES regions NOT NULL);

CREATE TABLE works_in(
company  INTEGER REFERENCES companies,
region_id  INTEGER REFERENCES regions,
PRIMARY KEY (company_id, region_id));

我想将此查询转换为SQL:

“检索在两个不同的区域中工作的公司,该区域每两个两个共享一个边界。按字母顺序为每个公司写上公司名称和三个共享边界的区域的名称。”

好吧,我尝试使用联接和分组,但是我只获得了在三个不同地区工作的公司的名称。我真的不知道如何在SQL或关系代数中实现此查询。

我正在使用PostgreSQL。

感谢您的任何建议和帮助!

1 个答案:

答案 0 :(得分:1)

我可以想出的最终解决方案是,我尝试通过一些逻辑步骤使我到达那里。 这是在T-SQL中。 (SQL Server 2016)

列出公司在多少个地区工作

sticky='w'

结果是这样的(下面包含测试数据):

Results

查看某个区域具有哪些边界:

SELECT company_name, COUNT(works_in.region_id) AS count FROM companies 
    LEFT JOIN works_in ON works_in.company_id = companies.company_id
GROUP BY company_name

enter image description here

列出公司在哪个邻近地区工作:

SELECT DISTINCT region_id1, region_id2 FROM region_borders 
INNER JOIN works_in w1 ON region_borders.region_id1 = w1.region_id
INNER JOIN works_in w2 ON region_borders.region_id2 = w2.region_id
WHERE (region_id1 = 1 OR region_id2 = 1)

这是针对公司4的,稍后将进行概括。

enter image description here

将它们放在一起:

SELECT * from regions where exists (SELECT region_id1, region_id2 FROM region_borders 
INNER JOIN works_in w1 ON region_borders.region_id1 = w1.region_id
INNER JOIN works_in w2 ON region_borders.region_id2 = w2.region_id
WHERE (region_id1 = regions.region_id OR region_id2 = regions.region_id)
AND w1.company_id = 4
AND w2.company_id = 4)

这里列出了在3个相邻地区工作的公司。 我没有选择所需的实际结果,您应该可以以此为基础并完成练习。