sql - 替代子查询的外部连接?

标签 sql oracle scalar-subquery

显然,Oracle 不允许对子查询进行外连接。对于表 A 中的每一行,我试图在表 B 中找到具有相同 ID 和最新日期的行。

像这样:

SELECT a.*, b.date, b.val1, b.val2
FROM a, b
WHERE b.id (+) = a.id
  AND b.date (+) = (SELECT MAX(b.date) FROM a, b WHERE a.id = b.id);

删除 b.date 上的外连接 (+) 允许对其进行解析,但是当表 B 上没有行时不会返回任何行。在这种情况下我需要查询只返回 NULL。有解决办法吗?

谢谢

最佳答案

我想你想要的是这个:

SELECT a.*, b.date, b.val1, b.val2
FROM a
LEFT JOIN b ON b.id = a.id
WHERE (b.date is null 
       or b.date = (SELECT MAX(b2.date) FROM b b2 WHERE a.id = b2.id));

这样,外连接只在 id 上执行。然后我们过滤掉 b.date 不是 a 中相应行的 max 的所有行。

顺便说一句,您会注意到我从子查询中删除了 a。如最初所写,子查询返回 b 中最大的日期,该日期在 a 中有相应的行。相同的值将用于外部查询的每一行。修改后的版本使子查询与外部查询相关联(即它将为返回的每一行获取相应的 max(date))。

关于sql - 替代子查询的外部连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22047577/

相关文章:

sql - Postgres 9.x - 有没有办法避免将数据库连接信息硬编码到 View 中?

java - 对 Oracle java 存储过程中的类解析的混淆

java - 从 MyBatis @Select 查询中捕获参数化字符串

SQL Server 开发者版最大大小容量

java - DB 查询很快,但 JPARepository 获取很慢

php - 使用 LIKE 子句搜索 Mysql

linux - Shell:从远程主机获取数据并执行一些其他命令

mysql - 通过内部连接或左/右连接替换与标量子查询的比较

mysql - 标量子查询需要花费大量时间来执行

mysql - 如何避免MySQL更新中相关子查询分配中的多列