sql - 使用自左外连接的 SQL 练习
问题描述
这是练习:如何输出所有成员的列表,包括推荐他们的个人(如果有)?确保结果按(姓、名)排序。
解决方案如下,只是我不明白为什么它是'ON recs.memid = mems.recommendedby'而不是'mems.memid = recs.recommendedby'。为什么后者不起作用?我想纠正我对如何使用左外连接的想法。
CREATE TABLE members (
memid SERIAL PRIMARY KEY,
firstname VARCHAR(20),
surname VARCHAR(20),
recommendedby INTEGER References members(memid)
);
SELECT
mems.firstname AS memfname,
mems.surname AS memsname,
recs.firstname AS recfname,
recs.surname AS recsname
FROM
cd.members AS mems
LEFT OUTER JOIN cd.members AS recs
ON recs.memid = mems.recommendedby
ORDER BY memsname, memfname;
解决方案
考虑以下数据:
MEMID | FIRSTNAME | SURNAME | RECOMMENDEDBY
------|-----------|---------|--------------
1 | John | Smith | null
2 | Karen | Green | 1
3 | Peter | Jones | 1
在这里,约翰推荐了凯伦和彼得,但没有人推荐约翰
'ON recs.memid = mems.recommendedby'
(“有效”的那个)
你会得到一份成员名单和推荐他们的人。根据表结构,任何成员只能由一名成员推荐,因此您只需一次获得所有成员。您正在获取推荐值并在“其他表”的 memid 列中查找它:
recommendedby --|--> memid of members that recommended them
MEMID | FIRSTNAME | SURNAME | RECOMMENDEDBY
------|-----------|---------|--------------
Karen | Green | John | Smith
Peter | Jones | John | Smith
John | Smith | null | null
推荐的列只有 John (1),所以在查找值 1 时,John 出现了。
'ON mems.memid = recs.recommendedby'
(那个不行的)
您将再次获得所有成员。但是在这里,您可以将它们作为推荐的人,可以这么说。如果他们没有推荐任何人,则配对记录将为空白。这是因为您正在获取 memid 值并查看它是否与“其他表”的推荐列匹配。如果一个会员推荐了多个,该记录会出现多次:
memid --|--> recommendedby
MEMID | FIRSTNAME | SURNAME | RECOMMENDEDBY
------|-----------|---------|--------------
Karen | Green | null | null
Peter | Jones | null | null
John | Smith | Karen | Green
John | Smith | Peter | Jones
凯伦和彼得没有推荐任何人,但约翰推荐了其他两个人。
推荐阅读
- java - 我可以在不使用类名的情况下调用另一个类的静态方法吗?
- python - 两个csv文件的比较和输出有什么不同?
- php - 我的 php 和 html 代码有什么问题?
- r - 获取列表的名称作为数据框中的列
- c++ - Emscripten 声称我在不使用 requestAnimationFrame 的情况下进行渲染
- spring - 使用 fetch 和 @RequestParams("params") List 时如何将列表绑定到控制器
- python - 具有歧义的上下文无关语法 - 使用 Ply lex/yacc 生成器的小型编译器
- loopbackjs - Loopback - 如何维护角色
- ruby-on-rails - mongo驱动程序没有检测到rails中的主节点
- oracle - 如何在oracle中加入2个包含null的表?