【问题标题】:update a column based on self join in oracle在oracle中根据self join更新列
【发布时间】:2021-08-15 22:31:32
【问题描述】:

我想在自联接的帮助下替换 列中的空值propertyaddress。但它运行了三十多分钟没有返回,我不得不取消任务。谁能帮帮我?

MERGE 
INTO housedata a
      USING 
      (select distinct b.id
             , b.parcelid
             , b.propertyaddress
             , NVL(a.propertyaddress, b.propertyaddress)
      from housedata a
          ,housedata b
             -- WHERE a.propertyaddress is null
               ) src
              ON (a.parcelid = src.parcelid and a.id != src.id)
  WHEN MATCHED THEN 
  UPDATE 
  SET propertyaddress = NVL(a.propertyaddress,src.propertyaddress)
  WHERE a.propertyaddress is null

【问题讨论】:

  • “它不起作用”是什么意思?它有效,但不会产生您想要的结果。它根本不起作用。它引发了一个错误(如果是,是哪一个)?示例数据可能会帮助我们帮助您。
  • @Littlefoot 谢谢。我的意思是 Query 运行超过 30 分钟,我必须取消任务。
  • 这是一次性任务,还是经常发生的任务?您预计需要多长时间?您能否提供一份关于您的运行的 SQL 监视器报告。
  • 调优 SQL 涉及很多方面。我们需要更多细节。请阅读this thread on asking Oracle tuning questions。

标签: sql oracle query-optimization


【解决方案1】:

您的 USING 子查询对于表的两个实例没有连接条件,因此它将生成两个表中所有行的乘积。你不想要那个。也许你的意思是编码是这样的?

MERGE 
INTO housedata a
      USING 
      (select b.parcelid
             , max(b.propertyaddress) as propertyaddress
      from housedata b
      where b.propertyaddress is not null
      group by b.parcelid
               ) src
   ON (a.parcelid = src.parcelid)
  WHEN MATCHED THEN 
  UPDATE 
  SET a.propertyaddress = src.propertyaddress
  WHERE a.propertyaddress is null

请注意,此逻辑处理 parcelid 的多个实例,其差异值为 propertyaddress。在没有查看您的数据或了解您的业务规则的情况下,很难知道这是否是一个有效的用例,以及max() 是否是合适的解决方案。只有你自己可以决定。


我已经给出了我的原始表的屏幕截图,其中包含属性地址中的空值。

要给出正确答案,我们需要查看整个数据集的代表性样本。因此,如果您显示一些按parcelid 过滤或排序的数据会更好,包括propertyaddress 不为空的行。事实上,我不得不猜测你的问题可能是什么。

我不明白 max() 函数是如何解决我的用例的。

如果每个parcelid 只有一行,并且填充了propertyaddress,则不需要 MAX()。但是,如果您有多个这样的实例,那么您需要一些逻辑来选择一个。除此之外,MERGE 要求它生成一个稳定的集合。它不必是 MAX():MIN() 也可以,也许其他一些聚合或分析函数也可以。同样,您需要选择最适合您的业务规则的规则。

【讨论】:

  • 非常感谢@APC。它对我有用,现在我想要的列中不再有空值。我已经给出了我的原始表的屏幕截图,其中包含属性地址中的空值。我想用具有相同宗地 ID 的属性地址替换那些空值。我不明白 max() 函数是如何解决我的用例的。你能帮我学习这个吗?再次感谢。
  • @MohammadLitonHossain - 我已经添加了对这一点的更详细的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多