首页 > 解决方案 > 使用自左外连接的 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;

标签: sql

解决方案


考虑以下数据:

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

凯伦和彼得没有推荐任何人,但约翰推荐了其他两个人。


推荐阅读