【问题标题】:Left joining a table to itself with no WHERE clause results in fewer rows than the original在没有 WHERE 子句的情况下将表与自身连接会导致行数少于原始行数
【发布时间】:2021-10-12 13:44:01
【问题描述】:

我有一个表 (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;

【问题讨论】:

  • 左连接不应该返回更少的行。
  • 我很好奇为什么这个问题被否决了。我知道我在这里犯了一个愚蠢的错误,但我认为问题本身写得很好而且很清楚。我没有生气或什么,只是想知道。

标签: sql oracle left-join


【解决方案1】:

我知道这不是您的实际问题,但您实际上甚至不需要为该示例执行 LEFT JOIN。只使用分析函数而不是聚合作为子查询的一部分会更容易。例如,您的示例查询可以变成:

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

【讨论】:

    【解决方案2】:

    这里的问题是我使用分析表功能查看行数,然后使用 Toad for Oracle 查看表的统计信息/大小信息。运行分析表似乎不一定会产生准确的行数。当我做select count(*) from table_new;table_old 时,我得到了完全相同的行数。哎呀。

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 2013-08-06
      • 2012-03-25
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 2023-03-04
      • 2020-01-10
      • 1970-01-01
      相关资源
      最近更新 更多