问题:假设公司可能位于多个城市.查找位于"小银行公司"所在的每个城市的所有公司.
答案:
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,因此不返回公司.
需要一段时间才能解决问题,但我希望这至少会有所帮助.如果有什么事情没有意义,请告诉我.