对于一个单一的答案,这需要解决很多问题,因此我将列出您在第一个示例中出错的地方,如何解决它,以及如何在其余示例中使用该策略。您可能希望在 Stack Overflow 上将剩余的问题拆分为新问题。从上周给出的答案可以看出,人们不愿意回答整个请求。
所以,问题:
假设这些公司可能位于几个城市。查找位于 Small Bank Corporation 所在城市的所有公司。
第 1 步:正确阅读提示
当我说这通常是解决这类问题中最难的部分时,我是完全真诚地说的。语言并不总是像我们希望的那样具体,不同的人可以用多种方式解释同一个句子。如果提示中有任何歧义,请务必与您的讲师沟通,并要求他们澄清您需要编写查询的内容。
第 2 步:检查出了什么问题
所以你写的查询并不能解决被问到的问题。为什么不?我们可以通过弄清楚您的查询到底做了什么来开始回答这个问题。我们可以先把它分成几部分:
SELECT company-name, city
FROM company
上面的代码将从名为“company”的表中的每一行中获取公司名称和城市。
SELECT company-name, city
FROM company
WHERE company-name = ‘Small Bank Corporation’
上面的代码将从名为 company 的表中的每一行中获取公司名称和城市,其中公司名称为“Small Bank Corporation”。
UNION ALL
上面的行将创建它之前和之后的选择的联合。因此,您创建了表中所有行的并集,以及公司名称为“Small Bank Corporation”的所有行。这不仅没有解决上面给出的查询,而且还为我们提供了我们没有要求的额外的冗余行。我们可以创建一个模型表company
来准确演示它的作用。
company-name | city
--------------------------------
Small Bank Corporation | A
Silly Bank Corporation | B
Large Bank Corporation | C
在此示例中,我们可以看到 Small Bank Corporation 是 A 市唯一的公司。因此,当我们使用 WHERE 语句指定它时,它将是唯一返回的行。所以当我们合并结果时,我们应该得到如下结果。
company-name | city
--------------------------------
Small Bank Corporation | A
Silly Bank Corporation | B
Large Bank Corporation | C
Small Bank Corporation | A
这真的没有帮助。那么我们该如何解决这个问题呢?
第 3 步:了解问题
提示要求查找位于Small Bank Corporation 所在城市的所有公司。我对该声明的解释是,在存在 Small Bank Corporation 的每个城市中,我们都想要镇上每家银行的名单。我们的最终结果将是 Small Bank Corporation 所在的每个城镇的所有银行的列表。例如,如果银行想要查看其竞争对手的完整列表,他们可能需要此信息。
第 4 步:修订
现在我们可以开始朝着正确的查询方向努力了。您知道要选择哪些变量,因此我们不需要更改第一行。编写查询的方法有很多,因此为了增加您对 SQL 的了解,我将提供现有答案的替代方法。
SELECT A.company_name
FROM company A, company B
WHERE A.city = B.city AND B.company_name = 'Small Bank Corporation'
GROUP BY company_name;
请允许我分解这里发生的事情:
- 创建了一个作为公司和公司的叉积的表。(A公司×B公司)
- 从该表中,我们想要投影城市 A 和城市 B 相同且公司 B 是小型银行公司的所有行。
- 从该投影中,我们要选择公司名称。
- 使用 group by 去除多余的公司名称(这个问题可以存在多行同一个公司名称,因为同一个公司可以存在于不同的城市)。
尝试使用我提供的步骤来解决您的其余提示,如果您仍然遇到困难,请随时在此处提出更具体的问题。