[英]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.