不带WHERE子句的左连接表会导致比原始表更少的行



我有一个表(table_old),其中列(person_id)有时具有重复的值。我想添加一列,对于person_id的每个值,它都有age_at_midmonth的最大值。Table_old有27,236,296行。Table_new有27,209,850行。行数不应该减少,因为这是一个没有WHERE子句的LEFT JOIN。这里发生了什么?我做错了吗?有没有更好的办法?

查询正在Oracle中执行。
create table schema1.table_new as
select 
t1.*, 
t2.current_age
from 
schema1.table_old t1
left join (
select person_id, max(age_at_midmonth) as current_age
from schema1.table_old
group by person_id
) t2
on t1.person_id = t2.person_id;

我知道这不是你的实际问题,但你实际上甚至不需要为那个例子做一个LEFT JOIN。使用分析函数比将聚合作为子查询的一部分更容易。例如,您的示例查询可以转换为:

SELECT t.*, 
MAX(t.age_at_midmonth) OVER (PARTITION BY t.person_id) AS CURRENT_AGE
FROM schema1.table_old t;

这里的问题是,我正在使用Analyze Table功能查看行数,然后使用Toad for Oracle查看表的Stats/Size信息。运行Analyze Table似乎并不一定产生准确的行数。当我对select count(*) from table_new;table_old进行同样的操作时,我得到了完全相同的行数。哎呀。

相关内容

  • 没有找到相关文章

最新更新