【发布时间】:2018-12-10 09:38:36
【问题描述】:
我创建了一个students 表,其中student_id 列作为主键,
student_name 和 gender。
我还有一张表 gender,其中包含 gender_id 和 gender。
student 中的gender_id 指的是表gender。
表格数据如下所示:
学生桌
STUDENT_ID STUDENT_NAME GENDER
1 Ajith 1
2 Alan 1
3 Ann 2
4 Alexa 2
5 Amith 1
6 Nisha 2
7 Rathan 1
8 Rebecca 2
9 asdf null
10 asd null
11 dbss null
性别表
GENDER_ID GENDER
1 Male
2 Female
3 Others
我的查询及其结果
SELECT S.STUDENT_NAME,
G.GENDER
FROM STUDENTS S
FULL OUTER JOIN GENDER G ON G.GENDER_ID = S.GENDER
结果为 12 行,包括性别表中的 Others 值。
STUDENT_ID STUDENT_NAME GENDER
1 Ajith Male
2 Alan Male
3 Ann Female
4 Alexa Female
5 Amith Male
6 Nisha Female
7 Rathan Male
8 Rebecca Female
Others
9 asdf
10 asd
11 dbss
我正在尝试限制特定的student_id:
SELECT S.STUDENT_ID,
S.STUDENT_NAME,
G.GENDER
FROM STUDENTS S
FULL OUTER JOIN GENDER G ON G.GENDER_ID = S.GENDER
WHERE S.STUDENT_ID <> 11;
现在总行数减少到 10。
STUDENT_ID STUDENT_NAME GENDER
1 Ajith Male
2 Alan Male
3 Ann Female
4 Alexa Female
5 Amith Male
6 Nisha Female
7 Rathan Male
8 Rebecca Female
9 asdf
10 asd
为什么具有 Others 值的一行从第二个选择查询中消失了? 我正在尝试查找此问题的原因。
【问题讨论】:
-
嗨。了解 LEFT/RIGHT JOIN 返回的内容:INNER JOIN 行加上由 NULL 扩展的不匹配的左/右表行。 FULL JOIN 返回由 NULL 扩展的 INNER JOIN 行 UNION ALL 不匹配的左右表行。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。 WHERE 或 INNER ON 在 OUTER JOIN ON 删除任何由 NULL 扩展的行后,要求可能 NULL 扩展的列不为 NULL,即只留下 INNER JOIN 行,即“将 OUTER JOIN 转换为 INNER JOIN”。你有那个。
-
请始终使用谷歌搜索错误消息以及您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称和“site:stackoverflow.com”和标签并阅读很多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并按照minimal reproducible example 采取行动--清除规范、剪切、粘贴和可运行代码(具有少量代表性输入)和所需输出。
标签: postgresql outer-join