【问题标题】:Merge statement not matched with the ON Clause in oracle sqloracle sql中的合并语句与ON子句不匹配
【发布时间】:2015-02-06 14:39:13
【问题描述】:

我有 oracle sql 合并语句查询,我想在其中将数据从 PROCESS_MONITOR_STATISTIC 合并到 TEMP_PROCESS_MONITOR_STATISTIC 表。
ID 是在PROCESS_MONITOR_STATISTIC 表中生成的序列。所以我总是希望将数据放入TEMP_PROCESS_MONITOR_STATISTIC 表中,其ID 大于来自PROCESS_MONITOR_STATISTIC 的ID。因此,当我执行查询时,我总是希望将最新数据插入TEMP_PROCESS_MONITOR_STATISTIC 表中。我尝试了这个查询,但没有得到最新的数据。

merge into TEMP_PROCESS_MONITOR_STATISTIC TSM
using (
   select * from
(select ID,PROCESS_MONITOR_ID,PROCESS_START_DATE from 
PROCESS_MONITOR_STATISTIC@FONIC_RETAIL) where rownum<=1000
) data
ON (TSM.ID > data.ID)
when not matched then
insert(ID,PROCESS_MONITOR_ID,PROCESS_START_DATE)
values(data.ID,data.PROCESS_MONITOR_ID,data.PROCESS_START_DATE);

【问题讨论】:

  • 尝试将“TSM.ID > data.ID”移动到 using 部分 - 即使其成为“这是我正在提取的数据”的一部分。限制那部分。 (当然,您可能需要一个子查询来执行此操作;))然后,在“ON”部分,您需要链接“PKs”......这就是“TSM.id = data.ID”。如果它们不存在,它将不匹配,并且会命中您的插入。
  • 其实想多了,这里为什么不直接用一个简单的INSERT语句呢?合并对于您需要的东西似乎“过大”?
  • 您的 using 子句有一个 rownum 过滤器,但没有排序依据;您确定返回您期望的 ID 吗?但是使用&gt;,我认为您可能会得到更多(重复)匹配,这会导致重复插入尝试;那不应该是=吗?
  • 单次插入导致逻辑困难,不知道如何比较ID,只插入大于单次插入语句的ID
  • @AlexPoole 我不使用 order by,因为它会影响查询执行时间。因为它必须为此扫描数百万条记录

标签: sql oracle insert merge


【解决方案1】:

如果您所做的只是“将项目从 A 插入表 B,这些项目尚不存在”。

应该这样做:

  INSERT INTO TEMP_PROCESS_MONITOR_STATISTIC
    select ID,PROCESS_MONITOR_ID,PROCESS_START_DATE
      from PROCESS_MONITOR_STATISTIC@FONIC_RETAIL
     minus 
       select ID,PROCESS_MONITOR_ID,PROCESS_START_DATE
         from TEMP_PROCESS_MONITOR_STATISTIC;

不需要合并。

【讨论】:

  • 您好,我的 PROCESS_MONITOR_STATISTIC 表中有数百万条记录,并且我的 TEMP_PROCESS_MONITOR_STATISTIC 中有最新数据,我现在只想将最新数据插入其中。只有一种方法我必须比较序列生成的表中的 ID,并且只包含大于的表。
  • 你试过插入吗?如果确实需要很长时间,(Oracle 将使用索引为我们链接这些表.. MINUS 可能是最有效的方法),但是,您可以通过执行“select (max(id)来自 temp_process_monitor_statistic,” 并将其用作您的“id > xxx”。让我也为该方法发布一个选项。
  • 你能在改变你的答案时告诉我你的意思吗?
  • 刚刚发布了另一个选项 - 两个都试一下,看看哪个更适合你。
【解决方案2】:

作为另一种选择......你可以试试这个:

  INSERT INTO TEMP_PROCESS_MONITOR_STATISTIC
    select ID,PROCESS_MONITOR_ID,PROCESS_START_DATE
      from PROCESS_MONITOR_STATISTIC@FONIC_RETAIL
     where id > (select max(id) from TEMP_PROCESS_MONITOR_STATISTIC );

仅根据目标表中的最大 ID 来限制它。

【讨论】:

  • 它运行同上谢谢,但我不知道为什么使用上述语句时查询执行时间更长
  • 抱歉哪一个运行时间更长?带有“>”的那个还是使用“减号”的那个?你在表上有什么索引?他们被分区了吗?
  • 'minus' 查询我无法运行,因为它也会插入较旧的数据,而另一个查询需要超过 15 分钟的时间。我尝试使用合并查询,即使它出错但执行时间更少
  • 再次。表上有哪些索引?表是否分区?另外,统计数据是最新的吗?
  • 统计是最新的,索引是对ID进行的
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多