我现在正在做一些有关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。
感谢您的任何建议和帮助!
答案 0 :(得分:1)
我可以想出的最终解决方案是,我尝试通过一些逻辑步骤使我到达那里。 这是在T-SQL中。 (SQL Server 2016)
sticky='w'
结果是这样的(下面包含测试数据):
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
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的,稍后将进行概括。
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个相邻地区工作的公司。 我没有选择所需的实际结果,您应该可以以此为基础并完成练习。