显然,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/