查找位于每个城市SQL的所有公司

jin*_*nan 3 sql

在此输入图像描述

问题:假设公司可能位于多个城市.查找位于"小银行公司"所在的每个城市的所有公司.

答案:

Select S.company_name
from company S
where not exists
  (select city
  from company 
  where company_name = 'Small Bank Corporation'
  except
    (select city
    from company T
    where S.company_name = T.company_name
    )
 )
Run Code Online (Sandbox Code Playgroud)

我如何阅读: 选择所有不存在"小银行公司"城市但不在表S和T中的公司.

但是,S.company_name总是= T.company_name因为它们是同一个表的副本?

我正在寻求帮助来理解解决方案.

任何解释赞赏!

小智 5

这需要一些解剖,所以让我们按个别部分细分.

为了简化操作,请将查询视为在Company表中的每一行上逐个运行.

第1部分:

SELECT s.Company_Name FROM Company s
Run Code Online (Sandbox Code Playgroud)

这就是我们现在的公司.因此,假设公司表中的第一行是Apple,s.Company_Name现在是'Apple'.

第2部分:

SELECT City FROM Company WHERE Company_Name = 'Small Bank Corporation'
Run Code Online (Sandbox Code Playgroud)

这给我们列出了小银行公司所在的每个城市,我们很快就会需要这个.

第3部分:

SELECT City FROM Company t WHERE s.Company_Name = t.Company_Name
Run Code Online (Sandbox Code Playgroud)

还记得s.Company_Name是'Apple'的吗?这将为我们提供Apple存在的每个城市的列表.

第4部分:

现在我们有了第2部分和第3部分的列表,我们使用EXCEPT子句从第2部分的结果中"删除"第3部分中的所有条目.

示例1 - 在第2部分中说我们得到了"伦敦"和"纽约市"(小银行公司所在的城市),在第3部分中我们得到了"伦敦","纽约市"和"巴黎"(这两个城市) Apple存在).在此示例中,我们的EXCEPT子句的结果是一个空结果集(一个不返回任何行的SELECT).

例2 - 但是,如果第2部分给了我们"伦敦","纽约市"和"巴黎"以及第3部分给了我们"伦敦"和"纽约市",那么我们的EXCEPT条款的结果将是一行,包含"巴黎".

这带给我们......

第5部分:

WHERE NOT EXISTS(...)
Run Code Online (Sandbox Code Playgroud)

这将删除"小银行公司"所在的每个城市都不存在的任何公司.如果它们是示例1(来自第4部分),则NOT EXISTS为真,但如果它们是示例2,则NOT EXISTS为false,因此不返回公司.

需要一段时间才能解决问题,但我希望这至少会有所帮助.如果有什么事情没有意义,请告诉我.