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

时间:2017-02-21 00:56:24

标签: sql

enter image description here

问题: 假设这些公司可能位于几个城市。查找位于“小银行公司”所在的每个城市的所有公司。

答案

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
    )
 )

我如何阅读本文: 选择所有公司 哪里不存在 “小银行公司”的城市,不在表S和T中。

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

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

任何解释都赞赏!

2 个答案:

答案 0 :(得分:5)

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

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

第1部分:

SELECT s.Company_Name FROM Company s

这设定了我们现有的公司。所以,让我们说公司表中的第一行是Apple,s.Company_Name现在是Apple'。

第2部分:

SELECT City FROM Company WHERE Company_Name = 'Small Bank Corporation'

这为我们提供了小型银行公司所在的每个城市的列表,我们很快就会需要这个。

第3部分:

SELECT City FROM Company t WHERE s.Company_Name = t.Company_Name

记住s.Company_Name是如何' Apple&#39 ;?这将为我们提供一个每个城市的列表,其中包含Apple。

第4部分:

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

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

示例2 - 然而,如果第2部分给了我们"伦敦","纽约市"和"巴黎"第3部分给了我们"伦敦"和"纽约市",然后我们的EXCEPT子句的结果将是一行,包含" Paris"。

这将我们带到......

第5部分:

WHERE NOT EXISTS(...)

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

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

答案 1 :(得分:0)

您可能会认为外部循环内部存在一个循环。子查询 select city from company T where S.company_name = T.company_name将一遍又一遍,并带有一个“常量”元素:S.company_name