【问题标题】:Full Outer Joins In PostgreSql [duplicate]PostgreSql中的完全外部连接[重复]
【发布时间】:2018-12-10 09:38:36
【问题描述】:

我创建了一个students 表,其中student_id 列作为主键, student_namegender

我还有一张表 gender,其中包含 gender_idgender

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


【解决方案1】:

这是因为NULL &lt;&gt; 11 不是TRUE,而是NULL,并且只有条件为TRUE 的行才会包含在结果中。

你必须写类似的东西

WHERE s.student_id IS DISTINCT FROM 11

【讨论】:

  • 感谢您提供的信息。
【解决方案2】:

您的第二个选择查询返回 student_id 与 11 不同 (&lt;&gt;) 的所有行。

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 2017-06-10
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2017-07-05
    • 2014-08-07
    相关资源
    最近更新 更多