Sql 查找位于每个城市的所有公司
问题: 假设这些公司可能位于多个城市。查找“小型银行公司”所在城市的所有公司 回答:Sql 查找位于每个城市的所有公司,sql,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.
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\u name
将始终=T.company\u name
,因为它们是同一个表的重复项
我请求帮助理解解决方案
感谢您的解释 这需要一点解剖,所以让我们将其分解为各个部分 为了使查询更简单,可以将查询视为逐个遍历Company表中的每一行 第1部分:
SELECT s.Company_Name FROM Company s
这就决定了我们现在的公司。假设公司表的第一行是苹果公司,美国公司的名称现在是“苹果”
第2部分:
SELECT City FROM Company WHERE Company_Name = 'Small Bank Corporation'
这给了我们一份小银行公司所在的每个城市的名单,我们很快就会需要这个
第3部分:
SELECT City FROM Company t WHERE s.Company_Name = t.Company_Name
还记得美国公司的名字是“苹果”吗?这将给我们一份苹果所在的每个城市的列表
第4部分:
现在我们有了第2部分和第3部分中的列表,我们使用EXCEPT子句从第2部分的结果中“删除”第3部分中的所有条目
例1——假设在第2部分中我们得到了“伦敦”和“纽约市”(小银行公司所在的城市),在第3部分中我们得到了“伦敦”、“纽约市”和“巴黎”(苹果所在的城市)。在本例中,我们的EXCEPT子句的结果是一个空结果集(一个不返回任何行的SELECT)
例2——然而,如果第2部分给了我们“伦敦”、“纽约市”和“巴黎”,第3部分给了我们“伦敦”和“纽约市”,那么我们的EXCEPT子句的结果将是一行,其中包含“巴黎”
这让我们想到
第5部分:
WHERE NOT EXISTS(...)
这将删除所有在“小型银行公司”所在的每个城市都不存在的公司。如果它们是示例1(来自第4部分),则NOT EXISTS为true,但如果它们是示例2,则NOT EXISTS为false,因此不会返回company
你的头脑需要一段时间才能清醒过来,但我希望这至少对你有所帮助。如果有任何不合理的地方,请告诉我。您可能认为有一个循环在外循环中运行。子查询
从公司T中选择城市,其中S.company\u name=T.company\u name
将反复运行,有一个“常量”元素:S.company\u name