我正在查询有关某些值的分组并将数据插入基于分组的不同表中。在Oracle中查找分组记录
表名是DETAILS2。该表是这样的:
NUM2 MAT_NUM TRAVEL_DT TRAVEL_TYP TRAVEL_REQ
1-7OR Rail 11-OCT-2016 Train 2
1-7OR Ground 12-OCT-2016 Bus 2
1-7OR Fly 15-0CT-2016 Flight 1
1-72R Rail 11-SEP-2016 Train 2
1-72R Ground 12-SEP-2016 Bus 3
1-72R Fly 15-SEP-2016 Flight 1
我需要通过NUM2,MAT_NUM第一组,然后由TRAVEL_REQ。
- 如果我发现MAT_NUM是Rail或Ground与TRAVEL_REQ相同,那么我只需要在另一个表中插入一条记录。
- 如果我发现MAT_NUM是铁路或地面与不同的TRAVEL_REQ,那么我需要插入两个记录到另一个表。
- 如果我发现MAT_NUM是Fly,那么我只需要在另一个表中插入一条记录。
为了达到这个目的,我先写了下面的代码。但它插入所有记录。你能帮我修改代码吗?
DECLARE
NUM1 VARCHAR2(50);
NXTNUM1 VARCHAR2(50);
DECIDER VARCHAR2(10);
TYP1 VARCHAR2(50);
CURSOR FET_TYP
IS
SELECT DISTINCT NUM2,
LEAD(NUM2) OVER (ORDER BY NUM2),
CASE WHEN DET.MAT_NUM NOT LIKE '%Fly%' THEN 0 ELSE 1 END DECIDER,
MAT_NUM
FROM DETAILS2
ORDER BY NUM2;
BEGIN
OPEN FET_TYP;
LOOP
FETCH FET_TYP
INTO NUM1,
NXTNUM1,
DECIDER,
TYP1;
EXIT WHEN FET_TYP%NOTFOUND;
IF ((NUM1 = NXTNUM1) AND (DECIDER = 0))
THEN
INSERT INTO TEMP1
VALUES (NUM1, TYP1, 'Ground');
ELSIF ((NUM1 = NXTNUM1) AND (DECIDER = 1))
THEN
INSERT INTO TEMP1
VALUES (NUM1, TYP1, 'Flight');
END IF;
END LOOP;
COMMIT;
CLOSE FET_TYP;
END;
以下是最终输出的样子。
NUM2 MAT_NUM TRAVEL_DT TRAVEL_TYP TRAVEL_REQ
1-7OR Ground 12-OCT-2016 Bus 2
1-7OR Fly 15-0CT-2016 Flight 1
1-72R Rail 11-SEP-2016 Train 2
1-72R Ground 12-SEP-2016 Bus 3
1-72R Fly 15-SEP-2016 Flight 1
这些都是与在写入插入语句我会插入一些默认值沿着主列输出。第一条记录可以是铁路或地面。 TRAVEL_REQ具有相同的值时无关紧要。
这可能没有游标可行。你能在TEMP1中编辑你的文章和预期的结果吗? – Anand
在你的第一个条件(1.) - 应该插入哪条记录?只说“只有一个”是不够的,你必须说明哪一个。然后:在“其他表”中插入什么 - 这个表中的行是否有相同的列?还是只有一些列?或者完全不同的东西?另一个问题:条件(3.)是什么意思?对于1-70R你有三种类型。其中之一是FLY。这是否意味着你只在三行中插入一行?如果是这样,哪一个? (如果travel_req在另外两行中不同 - 这将与条件2相矛盾。) – mathguy
1.任何人都可以插入。 2.对于1-7OR,我插入2条记录,因为TRAVEL_REQ是相同的。对于1-72R,我插入3条记录,因为TRAVEL_REQ对于所有 –