下面的 SQL-Query 是什么?

What will be the SQL-Query for the following?

表格:
员工(员工姓名,街道,城市)
工作(员工姓名,公司名称,薪水)
公司(公司名称,城市)
管理(员工姓名,经理姓名)

查询:假设公司可能位于多个城市。查找所有公司 位于 'Small Bank Corporation' 所在的每个城市。

我尝试了:
select cname from company c where (select city from company c2 where c2.cname='Small Bank Corporation' MINUS select city from company where cname=c.cname) is null;

以及类似的几种变体,但它根本不起作用。我的想法是生成一个集合A和集合B。集合B是Small bank公司所在的所有城市。说 Set B = {Mumbai,Pune} 。现在我正在尝试为公司 table 中的每个公司生成集合 A。假设第一个循环,cname = 'FBC' 然后 Set A 将包含 FBC 所在的所有城市。
现在,设置 B - 如果此部分变为空,则设置 A,这意味着 A 至少作为 SBC 位于所有城市中,我正在尝试打印该设置 A 的公司名称。但出于某种原因,这是行不通的,我无法弄清楚。

Oracle 错误:单行子查询 returns 多于一行

对此有什么想法吗?谢谢

您可以使用 EXISTS:

来实现
SELECT * FROM
COMPANY
WHERE 
name != 'Small Bank Corporation'
AND EXISTS
(SELECT 1 FROM 
COMPANY as SBC WHERE 
SBC.name= 'Small Bank Corporation'
AND SBC.city = COMPANY.city)

首先:数据模型有点不合适,因为 table company 不包含每个公司一行。例如,更好的名称是 company_branch_office。我们在编写查询时应该牢记这一点,因为查询可能读起来和它实际做的不一样。 (如果可以,请更改 table 名称。)

不管怎么说,要让小型银行公司所在的每一个城市都有分公司,也不是一件容易的事情。我能想到的最简单的方法是:

select company_name
from company
where city in
(
  select city
  from company
  where company_name = 'Small Bank Corporation'
)
group by company_name
order by count(distinct city) desc
fetch first row with ties;

这是如何工作的?

  1. 我获取位于 Small Bank Corporation 城市的所有分支机构。因此,我得到了 Small Bank Corporation 分支机构本身以及所有其他公司在同一城市的分支机构。
  2. 然后我按公司汇总,以获取公司在这些城市的分支机构的数量。我这里需要COUNT(DISTINCT city),因为一个公司可能在一个城市有两个或多个办公室
  3. 我按匹配城市的数量对公司进行排序,只保留那些数量最多的公司(即所有城市)。这当然适用于 Small Bank Corporation,也可能适用于其他公司 - 我们正在寻找的公司。

对于您提出的问题,Thorsten 的回答很好,但我认为这个问题很脆弱。如果您在外部查询中有一个过滤器并且不包括“Small Bank Corporation”,那么该查询将 return 具有最多重叠城市的公司——即使可能 none 重叠所有.

我会使用 HAVING 子句进行显式检查:

select c.company_name
from company c
where exists (select 1
              from company c2
              where c2.city = c.city and
                    c2.name = 'Small Bank Corporation'
             )
group by c.company_name
having count(*) = (select count(*)
                   from company c2
                   where c2.name = 'Small Bank Corporation'
                  );

请注意,这里使用 COUNT(*),前提是公司在一个城市中没有多行。如果可能,请在两个地方使用 count(distinct city)