簡體   English   中英

SQL 使用自左外連接的練習

[英]SQL exercise using a self Left Outer Join

這是練習:你如何 output 列出所有成員,包括推薦他們的個人(如果有的話)? 確保結果按(姓氏、名字)排序。

解決方案僅在下面,我不明白為什么它是“ON recs.memid = mems.recommendedby”而不是“mems.memid = recs.recommendedby”。 為什么后者不起作用? 我想糾正我對如何對自身使用 Left Outer Join 的想法。

  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' (“有效”的那個)

您將獲得一份成員列表以及推薦他們的成員。 根據表結構,任何成員只能被一個成員推薦,所以你只會得到所有成員一次。 您正在獲取 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

recommendedby 列只有 John (1),因此在查找值 1 時,John 出現了。


'ON mems.memid = recs.recommendedby' (不起作用的那個)

您將再次獲得所有成員。 但是在這里,您可以說他們是在做推薦的人。 如果他們沒有推薦任何人,配對記錄將為空白。 這是因為您正在獲取 memid 值並查看它是否與“其他表”的 recommendedby 列相匹配。 如果一個會員推薦了多個,記錄會出現多次:

memid           --|-->    recommendedby
MEMID | FIRSTNAME | SURNAME | RECOMMENDEDBY
------|-----------|---------|--------------
Karen | Green     | null    | null
Peter | Jones     | null    | null
John  | Smith     | Karen   | Green
John  | Smith     | Peter   | Jones

Karen 和 Peter 沒有推薦任何人,但 John 推薦了其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM