sql - SQL 右连接中的连接约束有什么作用吗?

标签 sql postgresql

我只需要修复一个正在执行 RIGHT JOIN 的查询,并在右侧添加一个约束:RIGHT JOIN b ON b.key = a.key AND b.active = 'Y'

它似乎完全忽略了 b.active 约束。这是 RIGHT JOIN 的限制吗?我交换了表格并将 b.active 约束移动到 WHERE,我从来不喜欢 RIGHT JOIN,我认为这加强了我对它的厌恶。

最佳答案

这个查询:

SELECT . . .
FROM a RIGHT JOIN
     b
     ON b.key = a.key AND b.active = 'Y'

等同于:

SELECT . . .
FROM b LEFT JOIN
     a
     ON b.key = a.key AND b.active = 'Y'

在这两种情况下,外连接的“驱动”表都有一个条件。左/右外部联接的逻辑是将所有记录保存在一个表中,即使 ON 条件的计算结果不为真。因此,该表的条件不会导致任何过滤。

如果要过滤该表,请使用 WHERE 子句:

SELECT . . .
FROM a RIGHT JOIN
     b
     ON b.key = a.key 
WHERE b.active = 'Y'

我还应该注意以下两个查询是等价的:

SELECT . . .
FROM a RIGHT JOIN
     b
     ON b.key = a.key AND b.active = 'Y';

SELECT . . .
FROM a RIGHT JOIN
     b
     ON b.key = a.key;

它们返回相同的一组行,假设 b 中没有重复键。但是,当 b.active 不是 'Y' 时,第二个将返回 a 中的匹配行。在这种情况下,第一个将为 a 中的列返回 NULL 值。这是一个微妙的区别。而且,老实说,我认为我从未发现它有多大用处。

关于sql - SQL 右连接中的连接约束有什么作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34025854/

相关文章:

ruby-on-rails - 将 ActiveRecord 查询转换为 PostgreSQL 查询

sql - PostgreSQL json路径表达式以查找具有特定键的第一个数组元素

sql - Postgresql 根据条件计数

sql - 自定义用户提供的过滤器,显示每个匹配项的数量

php - 这个sql表结构会阻止未经授权的sql插入吗?

r - 更改 R 包中的功能并在 Ubuntu 上安装

postgresql - 将 RDS Postgres 数据流式传输/逻辑复制到运动的最佳方式

mysql - 连接两个 SQL 查询

mysql - 合并行并将它们的值放在 mysql 中的单独列中

sql - 使用存储在另一个 SQL 表中的值更新列中的部分数据