|
原帖由 爱乐 于 2011-6-16 11:32 发表 ![]()
一直没理解newkid 大侠的思路,所以依葫芦画瓢照着步骤做了一遍!
琢磨了很久也没能解决这个问题,还请newkid 出手相助了!
11201的SQL解析有BUG, 11202就好了。
必须这么改:
WITH t (item_id,cnt) AS (
SELECT max(item_id),1 FROM items ---先取最近的
GROUP BY 1 --------- 强行加个GROUP BY
UNION ALL
select (SELECT MIN(item_id) FROM (SELECT item_id FROM items ORDER BY item_id DESC) WHERE ROWNUM<=t.cnt+2000) ---- 跳跃取2000行之后的ID
,cnt+2000 ----- 当日期还在区间内则递增取ID的范围。根据每天的数据两选取合适的步长,这里定为2000
FROM t
WHERE (SELECT created_date FROM items WHERE item_id=t.item_id)>=TRUNC(SYSDATE)-2) ---- 当取到的ID落在区间外则停止递归
CYCLE item_id SET cycle_flag TO 'Y' DEFAULT 'N' ---- 虽然ID都不重复但是ORACLE会报告有循环数据,所以在这里加上CYCLE语句
select *
FROM items
WHERE item_id>=(SELECT min(item_id) from t) ----- 利用前面的搜索结果
AND item_type=14
AND created_date >= TRUNC(SYSDATE)-2;
------------------
WITH t (item_id,cnt) AS (
SELECT (SELECT max(item_id) FROM items),1 FROM DUAL ---改为标量子查询
UNION ALL
select (SELECT MIN(item_id) FROM (SELECT item_id FROM items ORDER BY item_id DESC) WHERE ROWNUM<=t.cnt+2000) ---- 跳跃取2000行之后的ID
,cnt+2000 ----- 当日期还在区间内则递增取ID的范围。根据每天的数据两选取合适的步长,这里定为2000
FROM t
WHERE (SELECT created_date FROM items WHERE item_id=t.item_id)>=TRUNC(SYSDATE)-2) ---- 当取到的ID落在区间外则停止递归
CYCLE item_id SET cycle_flag TO 'Y' DEFAULT 'N' ---- 虽然ID都不重复但是ORACLE会报告有循环数据,所以在这里加上CYCLE语句
select *
FROM items
WHERE item_id>=(SELECT min(item_id) from t) ----- 利用前面的搜索结果
AND item_type=14
AND created_date >= TRUNC(SY |
|