下面的 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;
这是如何工作的?
- 我获取位于 Small Bank Corporation 城市的所有分支机构。因此,我得到了 Small Bank Corporation 分支机构本身以及所有其他公司在同一城市的分支机构。
- 然后我按公司汇总,以获取公司在这些城市的分支机构的数量。我这里需要
COUNT(DISTINCT city)
,因为一个公司可能在一个城市有两个或多个办公室
- 我按匹配城市的数量对公司进行排序,只保留那些数量最多的公司(即所有城市)。这当然适用于 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)
。
表格:
员工(员工姓名,街道,城市)
工作(员工姓名,公司名称,薪水)
公司(公司名称,城市)
管理(员工姓名,经理姓名)
查询:假设公司可能位于多个城市。查找所有公司
位于 '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;
这是如何工作的?
- 我获取位于 Small Bank Corporation 城市的所有分支机构。因此,我得到了 Small Bank Corporation 分支机构本身以及所有其他公司在同一城市的分支机构。
- 然后我按公司汇总,以获取公司在这些城市的分支机构的数量。我这里需要
COUNT(DISTINCT city)
,因为一个公司可能在一个城市有两个或多个办公室 - 我按匹配城市的数量对公司进行排序,只保留那些数量最多的公司(即所有城市)。这当然适用于 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)
。