这是一个练习:如何输出所有成员的列表,包括推荐他们的个人(如果有的话)?确保结果按(姓、名)排序。
解决方案在下面--我不明白为什么它是'ON recs.memid = mems.recommendedby‘而不是'mems.memid =recs.reenddby’。为什么后者不起作用?我想纠正我关于如何使用左外连接的想法。
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;发布于 2020-05-15 22:09:02
考虑以下数据:
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凯伦和彼得没有推荐任何人,但约翰推荐了其他人。
https://stackoverflow.com/questions/61827764
复制相似问题