【发布时间】: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 吗?但是使用>,我认为您可能会得到更多(重复)匹配,这会导致重复插入尝试;那不应该是=吗? -
单次插入导致逻辑困难,不知道如何比较ID,只插入大于单次插入语句的ID
-
@AlexPoole 我不使用 order by,因为它会影响查询执行时间。因为它必须为此扫描数百万条记录