问题: 假设这些公司可能位于几个城市。查找位于“小银行公司”所在的每个城市的所有公司。
答案:
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
,因为它们是同一个表的副本?
我正在寻求帮助来理解解决方案。
任何解释都赞赏!
答案 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